c++ - 将一个 std::vector 附加到另一个末尾的最有效方法是什么?

标签 c++ performance stl vector

设v1为目标 vector ,v2需要附加到它的后面。

我现在在做:

v1.reserve(v1.size() + v2.size()); 
copy(v2.begin(), v2.end(), back_inserter(v1));

这是最有效的方法吗?或者它可以通过复制一 block 内存来完成吗? 谢谢!

最佳答案

经过大量争论(以及 Matthieu M. 和 villintehaspam 的合理评论),我将把我的建议改为

v1.insert( v1.end(), v2.begin(), v2.end() );

我会保留以前的建议:

v1.reserve( v1.size() + v2.size() ); 
v1.insert( v1.end(), v2.begin(), v2.end() );

后一种方式有一些理由,尽管它们都不够强大:

  • 无法保证重新分配 vector 的大小 - 例如如果总和大小为 1025,它可能会重新分配到 2048——取决于实现。 reserve 也没有这样的保证,但对于特定的实现,它可能是正确的。如果寻找瓶颈,检查它可能是合理的。
  • reserve 清楚地表明了我们的意图——在这种情况下优化可能会更有效(reserve 可以在某些一流的实现中准备缓存)。
  • 另外,使用 reserve 我们有一个 C++ 标准保证只会有一个重新分配,而 insert 可能会效率低下并进行多次重新分配(也用特定的实现进行测试)。

关于c++ - 将一个 std::vector 附加到另一个末尾的最有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2208293/

相关文章:

string - String.substring() 的性能与手动查找复制的 char[] 数组相比如何?

mysql - 对表中数百万条记录进行分区或索引?

c++ - 一组没有更新的整数的完美哈希函数

STL - 在 C++ 中,当键是带字符串的结构时,如何在带有仿函数的映射上使用 find_if?

c# - c++中的结构和c#中的结构有区别吗?

c++ - 定义静态全局数组以避免在函数中定义它

c++ - 需要对结构容器中的字段进行总计

c++ - 自定义类集的重载提取运算符

c++ - 包含 Qt 头文件的正确方法是什么?

c++ - 如何抛出 C++ 异常