这两个矢量初始化是否实现了相同的结果?

时间:2013-02-03 23:29:20

标签: c++

这些是否有效地做同样的事情?

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中的附加输入除外)

3 个答案:

答案 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和其他人的建议),你仍然有一种使用初始化列表的方法,另一种方法是在构造函数体中填充向量。

第二个将生成一个向量,其内容在构造函数体的开头有效

虽然两种方法都以相同大小和内容的向量结束,但第二种方法更可取,因为:

  1. 更清洁
  2. 它也可能更快。