繁体   English   中英

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

[英]Why iterator vector::insert is not valid after filling: iterator insert (const_iterator position, size_type n, const value_type& val);

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

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

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

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

在使用end()的情况下, size()仍然高于capacity() 尝试在insert()之前insert()容量设置为更大的容量。

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

迭代器有效性

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

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

it = myvector.end();

it指向结束,好。

it = myvector.insert ( it , 200 );

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

myvector.insert (it,2,300);

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM