C ++向量的insert&push_back差异

我想知道vectorpush_backinsert函数有什么区别。

是否有结构上的差异?

是否有非常大的性能差异?

最大的区别是他们的function。 push_back总是在vector的末尾放置一个新的元素, insert允许你select新元素的位置。 这会影响性能。 vector元素只在需要增加长度时才移动到内存中,因为分配的内存太less。 另一方面, insert力量来移动新元素的选定位置之后的所有元素。 你只需要为它做一个地方。 这就是为什么insert往往比push_back效率低的原因。

function有不同的目的。 vector::insert允许你在vector的指定位置插入一个对象,而vector::push_back只会将对象粘在结尾。 看下面的例子:

 using namespace std; vector<int> v = {1, 3, 4}; v.insert(next(begin(v)), 2); v.push_back(5); // v now contains {1, 2, 3, 4, 5} 

您可以使用insert来执行与使用v.insert(v.end(), value) push_back相同的作业。

除此之外, push_back(x)insert(x, end()) (也许性能稍好一点),关于这些函数还有几个重要的事情要知道:

  1. push_back仅在BackInsertionSequence容器中存在 – 例如,它不存在于set 。 它不能,因为push_back()授予你它将永远添加在最后。
  2. 一些容器也可以满足FrontInsertionSequence ,它们有push_front 。 这是由deque满足的,而不是由vector来满足的。
  3. insert(x, ITERATOR)来自InsertionSequence ,这对于setvector是很常见的。 这样你就可以使用setvector作为多次插入的目标。 然而, set另外insert(x) ,它实际上做了同样的事情(这个set第一个插入意味着仅仅通过从不同的迭代器开始寻找合适的地方 – 在这种情况下不使用的特征)。

注意最后一种情况,如果你要在循环中添加元素,那么做container.push_back(x)container.insert(x, container.end())将有效地做同样的事情。 但是,如果你首先得到这个container.end() ,然后在整个循环中使用它,这将是不正确的。

例如,您可能会以下代码:

 copy(a.begin(), a.end(), inserter(v, v.end()); 

这将有效地将整个a复制到v向量 ,并且只有在幸运的时候才能得到重新分配的向量(可以通过先调用reserve()来防止)。 如果你不那么幸运,你会得到所谓的UndefinedBehavior(tm)。 理论上这是不允许的,因为每次添加一个新的元素时,vector的迭代器被认为是无效的。

如果你这样做:

 copy(a.begin(), a.end(), back_inserter(v); 

它会以原始顺序复制a v的结尾,这不会带来迭代器失效的风险。