2015-07-03 49 views
-2

假设我有一个std容器,其中包含总共100个元素。 我再从container.My问题取出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,如果容器是一个deque我不知道该迭代器将得到无效

4 - 如果容器是一个地图,我相信所有的迭代器将得到无效。

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

回答

3

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

正确。 (Source

2-如果该容器是一个列表(双链接列表)和第50索引移除仅迭代或等于第50个索引会受到影响之后。

错误。只有50索引指向迭代器失效(列表中的节点重新链接,而不是移动)(Source

3,如果容器是一个deque我不知道该迭代器将得到无效

“除非擦除元素位于容器的末端或开始处,否则所有迭代器和引用都将失效,在这种情况下,只有迭代器和对擦除元素的引用才会失效。“(Source

4 - 如果容器是一个地图,我相信所有的迭代器会得到无效的。

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

+0

感谢您清理那个 – MistyD

相关问题