根据定义std :: vector :: insert保留吗?

时间:2016-02-12 09:37:27

标签: c++ c++11 vector

insert上调用std::vector成员函数时,在“推回”新项目之前会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());

还是其他更好的方法?

3 个答案:

答案 0 :(得分:13)

关于函数[link]的复杂性:

  

插入元素数量的线性(复制/移动构造)   加上位置(移动)后的元素数量。

     

此外,如果插入(3)范围内的InputIterator不是至少   一个前向迭代器类别(即,只是一个输入迭代器)的新的   容量不能预先确定,插入就会产生   额外的对数复杂度(重新分配)。

因此,有两种情况:

  • 可以确定新容量,因此您无需调用预留
  • 无法确定新容量,因此调用reserve应该很有用。

答案 1 :(得分:2)

  

std::vector::insert按定义保留吗?

是的,没有;取决于当前的容量。

从N4567草案,§23.3.6.5/ 1([vector.modifiers]):

  

如果新尺寸大于旧容量,则会导致重新分配。

如果vector中分配的内存容量足以容纳新元素,则不需要为vector分配额外的分配。所以不,那么它就不会保留记忆。

如果vector容量不够大,则分配新块,移动/复制当前内容并插入新元素。没有指定确切的分配算法,但通常它将在reserve()方法中使用。

  

......还是其他更好的方法?

如果您在将元素插入vector时担心分配过多,那么调用reserve方法的大小与要添加的预期元素的数量会最小化分配。

  

在{/ 1}插入之前,vector是否会调用reserve?即它是否在单个分配中分配了足够的容量?

无保证。它如何知道输入迭代器之间的距离?鉴于insert方法可以采用InputIterator(即单遍迭代器),它无法计算预期的大小。 如果迭代器中有其他内容(例如指针或RandomAccessIterator,该方法可以计算大小吗?是的,它可以。 它会吗?取决于实施和优化。

答案 2 :(得分:1)

documentation,似乎:

  

如果新size()大于旧容量(),则会导致重新分配。

还要注意,在这种情况下,所有迭代器和引用都将失效。

不言而喻,重新分配负责let currentGroup = current[0] as APIGroup ,如果你当时看一下那些操作,它就像一个一致的保留大小加一个每一步都要进行操作 您可以争辩说,插入顶部的insert调用可以加快发生多个重新分配的情况下的所有情况......嗯,对,它可能会有所帮助,但这主要取决于您的实际问题