以下情况中的迭代器何时变为无效

时间:2015-07-03 08:17:45

标签: c++ stl

假设我有一个std容器,其中总共有100个元素。 然后我从容器中删除了第50个元素。我的问题如下

1-If the container is a `std::vector` what iterators will become invalidated.
2-If the container is a `std::list` what iterators will become invalidated.
3-If the container is a `std::deque` what iterators will become invalidated.
4-If the container is a `std::map` what iterators will become invalidated. 

以下是根据我的理解答案,如果我错了请纠正我

1 - 如果在向量中移除了第50个元素,则所有下一个元素将向上移动一步,因为向量是动态数组且是连续的。因此,在第50个索引之前的迭代器将是有效的,并且大于或等于50的迭代器将在删除之后失效

2 - 如果容器是一个列表(双链接列表)并且删除了第50个索引,则只会影响第50个索引之后的迭代器。

3 - 如果容器是双端队列,我不确定哪些迭代器会失效

4 - 如果容器是地图,我相信所有的迭代器都会失效。

(0-100)因为需要重新排序/排序。如果我错了,请纠正我。

1 个答案:

答案 0 :(得分:3)

  

1 - 如果在向量中移除了第50个元素,则所有下一个元素将向上移动一步,因为向量是动态数组且是连续的。因此,在第50个索引之前的迭代器将是有效的,并且大于或等于50的迭代器将在删除之后失效

正确。 (Source

  

2 - 如果容器是一个列表(双链接列表)并且删除了第50个索引,则只会影响第50个索引之后的迭代器。

不正确的。只有指向第50个索引的迭代器才会失效(列表节点重新链接,不会移动)(Source

  

3 - 如果容器是双端队列,我不确定哪些迭代器会失效

"所有迭代器和引用都是无效的,除非擦除的元素位于容器的末尾或开头,在这种情况下,只有迭代器和对擦除元素的引用才会失效。" (Source

  

4 - 如果容器是地图,我相信所有的迭代器都会失效。

不正确的。与std::list相同的解释适用(std::map是链接树)。 (Source