C ++向量的insert&push_back差异
我想知道vector
的push_back
和insert
函数有什么区别。
是否有结构上的差异?
是否有非常大的性能差异?
最大的区别是他们的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())
(也许性能稍好一点),关于这些函数还有几个重要的事情要知道:
-
push_back
仅在BackInsertionSequence
容器中存在 – 例如,它不存在于set
。 它不能,因为push_back()
授予你它将永远添加在最后。 - 一些容器也可以满足
FrontInsertionSequence
,它们有push_front
。 这是由deque
满足的,而不是由vector
来满足的。 -
insert(x, ITERATOR)
来自InsertionSequence
,这对于set
和vector
是很常见的。 这样你就可以使用set
或vector
作为多次插入的目标。 然而,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
的结尾,这不会带来迭代器失效的风险。