-4

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

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]);
    }
}

对比

vector<MyType> stuff;
MyClass(MyType *things, int numThings) : stuff(things, things+numThings) {}//fixed

如果是的话,使用这两种方法的开销有多大?(方法一中的额外打字除外)

4

3 回答 3

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);
{ }
于 2013-02-03T23:32:39.970 回答
2

这可能是最好的:

MyClass(MyType*things, int numThings) : stuff(things, things + numThings) {}
//                                                    ^^^^^^^^^^^^^^^^^^
于 2013-02-03T23:34:31.033 回答
1

取决于你的意思是相同的结果。假设这两种方法都有效(您需要修改第二种方法以匹配迪特里希和其他人的建议),您仍然有一种方法使用初始化列表,另一种方法是将向量填充到构造函数的主体中。

第二个将产生一个向量,其内容在构造函数 body 的开头是有效的。

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

  1. 它更清洁
  2. 它也可能更快。
于 2013-02-03T23:44:12.227 回答