【发布时间】:2016-05-23 09:36:10
【问题描述】:
当在std::vector 上调用insert 成员函数时,它会在“推回”新项目之前reserve 吗?我的意思是标准是否保证?
换句话说,我应该这样做吗:
std::vector<int> a{1,2,3,4,5};
std::vector<int> b{6,7,8,9,10};
a.insert(a.end(),b.begin(),b.end());
或者像这样:
std::vector<int> a{1,2,3,4,5};
std::vector<int> b{6,7,8,9,10};
a.reserve(a.size()+b.size());
a.insert(a.end(),b.begin(),b.end());
还是其他更好的方法?
【问题讨论】:
-
这可能会回答你的问题:stackoverflow.com/questions/2208293/…
-
这取决于迭代器是输入迭代器还是严格更强的迭代器。对于任何更强大的内容,您可以通过
distance获得计数。这是 QoI,但任何体面的实现都不应为此重新分配超过一次。 -
libstdc++和libc++的实现如果至少给定前向迭代器,则立即为整个序列保留空间。 -
附带说明:虽然insert会在内部调用reserve,但两种变体实际上可能会产生不同的汇编代码并导致不同的性能。