为什么迭代器vector :: insert在填充后无效:迭代器插入(const_iterator position,size_type n,const value_type& val);

时间:2014-05-24 12:29:44

标签: c++ vector iterator

  

因为矢量使用数组作为其底层存储,所以插入   在矢量端以外的位置的元素导致容器   将所有位置之后的元素重新定位到新的元素   位置。   < 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是否仍然有效的情况? (或单身)

2 个答案:

答案 0 :(得分:1)

这是一个更好的参考和解释。

  

如果新size()大于旧容量(),则会导致重新分配。如果new size()大于capacity(),则所有迭代器和引用都将失效。否则,只有插入点之前的迭代器和引用仍然有效。过去的迭代器也无效。

- http://en.cppreference.com/w/cpp/container/vector/insert

如果您使用end()size()仍然高于capacity()。尝试在insert()之前将容量设置为更大的容量。

答案 1 :(得分:1)

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

  

迭代器有效期

     

如果发生重新分配,则与容器相关的所有迭代器,指针和引用都将失效。   否则,只有指向位置和超出位置的那些都是无效的,所有迭代器,指针和对位置之前的元素的引用保证在调用之前保持引用它们所指的相同元素。

如果您将第一个作业更改为结束,那么it指向的是什么。

it = myvector.end();

it指向结束,好。

it = myvector.insert ( it , 200 );

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

myvector.insert (it,2,300);

现在it再次失效,但您没有重新分配,所以它仍然如此。

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