用已知数量的元素填充向量:在构造函数中或使用保留方法指定其大小?

Populating a vector with known number of elements: specify its size in constructor or by using reserve method?

我想通过从流中读取单个元素来创建某种复杂类型的向量。我提前知道矢量大小。是在 vector 构造函数中指定元素个数更好,还是使用 reserve 方法更好?这两个哪个更好?

int myElementCount = stream.ReadInt();
vector<MyElement> myVector(myElementCount);
for (int i = 0; i < myElementCount; i++)
{
    myVector[i] = stream.ReadMyElement();
}

int myElementCount = stream.ReadInt();
vector<MyElement> myVector;
myVector.reserve(myElementCount);
for (int i = 0; i < myElementCount; i++)
{
    myVector.push_back(stream.ReadMyElement());
}

我只是创建一个整数向量或其他一些简单类型的情况呢?

这取决于 MyElement 是什么,特别是它的 operator= 是做什么的,所以它主要是通常的 "try both and use the faster one for you"。还有第三种选择,使用 c++11 和 emplace_back,尤其是在 MyElement 很重的情况下。

作为数据点,对于 intdouble 我发现使用构造函数(或 resize())和 [] 更快。具体来说,这种方式使编译器更容易对循环进行矢量化。