用已知数量的元素填充向量:在构造函数中或使用保留方法指定其大小?
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
很重的情况下。
作为数据点,对于 int
或 double
我发现使用构造函数(或 resize()
)和 []
更快。具体来说,这种方式使编译器更容易对循环进行矢量化。
我想通过从流中读取单个元素来创建某种复杂类型的向量。我提前知道矢量大小。是在 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
很重的情况下。
作为数据点,对于 int
或 double
我发现使用构造函数(或 resize()
)和 []
更快。具体来说,这种方式使编译器更容易对循环进行矢量化。