设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/