这些是否有效地做同样的事情?
vector<MyType> stuff;
MyClass(MyType *things, int numThings){
for (int i = 0; i < numThings; ++i){
//stuff[i] = things[i]; //original version of question, fixed
stuff.push_back(things[i]);
}
}
VS
vector<MyType> stuff;
MyClass(MyType *things, int numThings) : stuff(things, things+numThings) {}//fixed
如果是,使用任何一种方法或多或少的开销? (方法1中的附加输入除外)
答案 0 :(得分:5)
没有
第一种方法崩溃,因为它访问超出零大小向量末尾的元素。如果通过首先调整向量的大小来修复此错误,则首先初始化向量中的元素,然后使用operator=
覆盖。如果在循环中使用push_back()
来修复错误,那么可以在循环期间调整向量的大小。
第二种方法在一步中用所需的内容初始化载体,这是优选的,因为这更简单且明显正确。它也没有调整向量大小的开销,也没有两次初始化元素的开销。
编辑:看起来第二个也是一个错误:
stuff(things, numThings)
应该是
stuff(things, things + numThings)
我永远不会记住标准库类的所有构造函数,有趣的是string
有这个构造函数但vector
没有。
以下两个版本大致相同:
MyClass(MyType *things, int numThings)
{
stuff.reserve(numThings);
for (int i = 0; i < numThings; i++)
stuff.push_back(things[i]);
}
MyClass(MyType *things, int numThings)
: stuff(things, things + numThings);
{ }
答案 1 :(得分:2)
这可能是最好的:
MyClass(MyType*things, int numThings) : stuff(things, things + numThings) {}
// ^^^^^^^^^^^^^^^^^^
答案 2 :(得分:1)
取决于你的意思相同的结果。假设两种方法都有效(你需要修改第二种方法以匹配Dietrich和其他人的建议),你仍然有一种使用初始化列表的方法,另一种方法是在构造函数体中填充向量。
第二个将生成一个向量,其内容在构造函数体的开头有效。
虽然两种方法都以相同大小和内容的向量结束,但第二种方法更可取,因为: