假设我有一个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)因为需要重新排序/排序。如果我错了,请纠正我。
答案 0 :(得分:3)
1 - 如果在向量中移除了第50个元素,则所有下一个元素将向上移动一步,因为向量是动态数组且是连续的。因此,在第50个索引之前的迭代器将是有效的,并且大于或等于50的迭代器将在删除之后失效
正确。 (Source)
2 - 如果容器是一个列表(双链接列表)并且删除了第50个索引,则只会影响第50个索引之后的迭代器。
不正确的。只有指向第50个索引的迭代器才会失效(列表节点重新链接,不会移动)(Source)
3 - 如果容器是双端队列,我不确定哪些迭代器会失效
"所有迭代器和引用都是无效的,除非擦除的元素位于容器的末尾或开头,在这种情况下,只有迭代器和对擦除元素的引用才会失效。" (Source)
4 - 如果容器是地图,我相信所有的迭代器都会失效。
不正确的。与std::list
相同的解释适用(std::map
是链接树)。 (Source)