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的结尾,这不会带来迭代器失效的风险。