由于向量使用数组作为其基础存储,因此插入
  向量端以外位置的元素导致容器
  将所有定位后的元素重新定位到新元素
  职位。
  <http://www.cplusplus.com/reference/vector/vector/insert/>


我认为这是迭代器it在以下代码的最后一行之后不再有效的原因:

  std::vector<int> myvector (3,100);
  std::vector<int>::iterator it;

  it = myvector.begin();
  it = myvector.insert ( it , 200 );

  myvector.insert (it,2,300);


但是,如果将it的定义更改为myvector.end();,它仍然相同。这背后的原因是什么?它是如何工作的?在某些情况下,用某些元素填充向量的一部分后iterator insert仍然有效吗? (或单人)

最佳答案

是的,这就是在插入点无效之后(并且由于插入是在给定元素之前进行的)迭代元素的原因。如果插入到末尾,则没有元素的迭代器可能无效。无论插入到何处,结束迭代器始终无效。该页面上更相关的描述:


  迭代器有效性
  
  如果发生重新分配,则与容器相关的所有迭代器,指针和引用都将无效。
  否则,只有那些指向位置的元素才会失效,所有迭​​代器,指针和位置之前元素的引用都必须保证始终引用与调用前相同的元素。


如果您将第一个分配更改为结束,这是it指向的内容。

it = myvector.end();


it指向结尾,很好。

it = myvector.insert ( it , 200 );


插入到end不会使指向元素的任何指针无效,但是会使end迭代器无效,后者是it的旧值。幸运的是,您现在将分配给insert返回的迭代器。该迭代器不指向向量的末尾,而是指向新插入的元素。

myvector.insert (it,2,300);


现在it再次无效,但是您不必重新分配它,因此它保持不变。

当然,在每次插入之后,都有可能重新分配向量,在这种情况下,向量的任何部分的所有先前迭代器都将无效。通过在初始化迭代器之前用vector::reserve保证足够的空间可以避免这种情况。即使重新分配了向量,insert返回的新迭代器也将始终有效。

关于c++ - 为什么迭代器vector::insert在填充后无效:迭代器插入(const_iterator位置,size_type n,const value_type&val);,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23845033/

10-11 22:47