简短版本:在许多编程语言中返回大型对象(例如向量/数组)是很常见的.如果类有移动构造函数,这个样式现在在C++ 0x中是否可以接受,或者C++程序员认为它是奇怪/丑陋/可憎的?
长版本:在C++ 0x中,这仍然被认为是不好的形式?
std::vector<std::string> BuildLargeVector();
...
std::vector<std::string> v = BuildLargeVector();
Run Code Online (Sandbox Code Playgroud)
传统版本如下所示:
void BuildLargeVector(std::vector<std::string>& result);
...
std::vector<std::string> v;
BuildLargeVector(v);
Run Code Online (Sandbox Code Playgroud)
在较新的版本,则返回值从BuildLargeVector
是一个rvalue,所以v将使用的移动构造函数来构造std::vector
,假设(N)RVO不会发生.
甚至之前的C++ 0x第一形式常常是因为(N)RVO"有效"的.但是,(N)RVO由编译器决定.现在我们有rvalue引用,保证不会发生深度复制.
编辑:问题实际上与优化无关.所示的两种形式在现实世界的节目中具有几乎相同的性能.然而,在过去,第一种形式可能具有数量级更差的性能.因此,第一种形式是C++编程中的主要代码味道很长一段时间.不再了,我希望?
使用SQLAlchemy ORM,我想确保值是其列的正确类型.
例如,假设我有一个Integer列.我尝试插入值"hello",这不是一个有效的整数.SQLAlchemy允许我这样做.只有在我执行时session.commit()
,才会引发异常:sqlalchemy.exc.DataError: (DataError) invalid input syntax integer: "hello"…
.
我正在添加批量记录add(…)
,出于性能原因,我不想在每一个记录之后提交.
那么我怎么能:
session.add(…)
commit()
.抛出异常时是否可以添加额外的参数?
当我抛出异常时,我发送错误消息,但我还想在额外的参数中发送字段的名称.就像是:
throw new Exception('this is an error message', 'the field');
Run Code Online (Sandbox Code Playgroud)
所以,当我显示消息时,我可以这样做:
show_error($e->getFieldname, $e->getMessage());
Run Code Online (Sandbox Code Playgroud) 我已经完成了一些Google搜索,但是我得到了与编码字符串或文件相关的结果.
我可以用UTF-8 编写我的Node.js JavaScript源代码吗?我可以在注释,字符串或变量名中使用非ASCII字符吗?
ECMA-262似乎需要UTF-16编码,但Node.js不会运行UTF-16编码.js
文件.但是,它将运行UTF-8源并正确解释非ASCII字符.
这是设计还是"意外"?是否指定支持UTF-8源代码?
我有一个672字节长的遗留数据结构.这些结构按顺序存储在文件中,我需要读取它们.
虽然我可以逐个阅读它们,但这样做会很好:
// I know in advance how many structs to read in
vector<MyStruct> bunchOfStructs;
bunchOfStructs.resize(numberOfStructs);
ifstream ifs;
ifs.open("file.dat");
if (ifs) {
ifs.read(&bunchOfStructs[0], sizeof(MyStruct) * numberOfStructs);
}
Run Code Online (Sandbox Code Playgroud)
这是有效的,但我认为它只能起作用,因为数据结构大小恰好可以被编译器的结构对齐填充整除.我怀疑它会破坏其他编译器或平台.
另一种方法是使用for
循环一次一个地读取每个结构.
问题 - >我什么时候需要关注数据对齐?向量中动态分配的内存是否使用填充或STL是否保证元素是连续的?
我有一个简单的C++程序,我可以编译(从命令行g ++)并从我的工作计算机运行,但不是从我的家用计算机运行.我不知道他们有什么不同!它们都是macbooks,我在两者上都安装了iPhone SDK.
在我的家用电脑上:当我添加/Developer/usr/bin
到我的时候,PATH
我可以运行g ++,但它不能包括<string>
,它不能识别printf
和这样的功能.我还需要做些什么来使g ++工作?
在c ++中,我有一个名为"Student.h"的文件
class LinkedList {
private:
class Student {
public:
int stId;
char stName [20];
char stMajor[20];
double stAverage;
Student * next;
Student() {
next = 0;
}
Student(int stId, char stName [20], char stMajor[20], double stAverage) {
this.stId = stId;
strcopy(this.stName, stName); // there is error here !
strcopy(this.stMajor, stMajor);
this.stAverage = stAverage;
}
Run Code Online (Sandbox Code Playgroud)
我该怎么办 ?!
我试图找到最有效,最优化和最快速的方法来比较CString的标准向量.有问题的字符串区分大小写.我已经尝试将==运算符用于向量容器,但这有时会返回误报.我的意思是,例如,如果一个向量包含顺序(a,b,c)中的元素而另一个向量按顺序包含它们(b,c,a),则==运算符将返回false,即使它们共享相同的数据.另一件事是它不做区分大小写的比较.
我曾想过使用这样的基本嵌套循环方法:
//Not Tested
BOOL bMatch = TRUE;
for(int i=0; i<Vec1.size();i++)
{
if(!bMatch)
break;
int nComp=0;
for(int j=0;j<Vec2.size();j++)
{
if(vec1[i].CompareNoCase(Vec2[j])==0)
{
//We have a match--check next item
break;
}
else
{
nComp++;
if(nComp == Vec2.size()-1)
{
//Reached end of vector and no match found
//Vectors don't match
bMatch=FALSE;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码没有经过测试,我不确定是否有更好的方法可以实现这种比较,而无需使用嵌套循环.
非常感谢任何建议或帮助......
c++ ×5
stl ×2
c++11 ×1
char ×1
coding-style ×1
comparison ×1
copy ×1
database ×1
g++ ×1
gcc ×1
javascript ×1
macos ×1
mfc ×1
node.js ×1
orm ×1
php ×1
python ×1
sqlalchemy ×1
unicode ×1
vector ×1