c++ - 用已知数量的元素填充 vector : specify its size in constructor or by using reserve method?

标签 c++ vector std

我想通过从流中读取单个元素来创建某种复杂类型的 vector 。我提前知道 vector 大小。是在 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());
}

如果我只是创建一个 int vector 或其他一些简单类型呢?

最佳答案

这取决于 MyElement 是什么,特别是它的 operator= 做了什么,所以它主要是通常的“尝试两者并为您使用更快的那个”。还有第三种选择,使用 c++11 和 emplace_back,尤其是在 MyElement 很重的情况下。

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

关于c++ - 用已知数量的元素填充 vector : specify its size in constructor or by using reserve method?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33662386/

相关文章:

c++ - 在什么意义上 std::disjunction 在 compile_time 短路

c++ - 组合 ECDSA key

c++ - 为什么我会使用 push_back 而不是 emplace_back?

c++ - 从 vector 中提取子 vector 的最佳方法?

c++ - 直接减去两个 vector<point2f>

c++ - 替换字符串中的多对字符

c++ - 为什么 ASIO 套接字 open() 会失败?

c++ - 无法与标准库链接

c++ - 存储和检索这个的最佳方式..?

c++ - std::experimental::filesystem::recursive_directory_iterator 跳过文件夹及其子文件夹