原迭代器指的是进行操作之前保存的迭代器,包括begin()、end()以及其他位置的迭代器。
1 vector
插入元素:
(1)尾后插入push_back():size < capacity时,首迭代器不失效尾迭代失效(未重新分配空间),size == capacity时,所有迭代器均失效(需要重新分配空间)。
(2)中间插入insert(iterator, n):中间插入:size < capacity时,首迭代器不失效但插入元素之后所有迭代器失效,size == capacity时,所有迭代器均失效。
删除元素:
尾后删除pop_back():只有尾迭代失效。
中间删除erase(iterator):删除位置之后所有迭代失效。
2 deque
插入元素:
(1)尾部插入push_back()
:原迭代器中end()会失效,其他的都不会失效。
(2)头部插入push_front()
:原迭代器中begin()会失效,其他的都不会失效。
(3)中间插入insert(iterator, n)
:向前移动则导致原迭代器中插入点及插入点之前的迭代器都失效;向后移动则导致迭代器中插入点及插入点之后的迭代器都失效。
删除元素:
(1)尾部删除pop_back()
:原迭代器中end()会失效,其他的都不会失效。
(2)头部删除pop_front()
:原迭代器中begin()会失效,其他的都不会失效。
(3)中间删除erase(iterator):向前移动将导致原迭代器中删除点及删除点之后的迭代器失效;向后移动将导致原迭代器中删除点及删除点之前的迭代器都失效。
3 list
因为list的底层结构是双向链表,所有操作都只是针对节点移动指针,不会涉及到位置变化,操作影响的范围很小。
插入元素:
(1)尾部插入push_back()
:原迭代器中end()会失效,其他的都不会失效。
(2)头部插入push_front()
:原迭代器中begin()会失效,其他的都不会失效。
(3)中间插入insert(iterator, n)
:原迭代器中插入点会失效,其他的都不会失效。
删除元素:
(1)头部删除pop_front()
:原迭代器中begin()会失效,其他的都不会失效。
(2)尾部删除pop_back()
:原迭代器中end()会失效,其他的都不会失效。
(3)中间删除erase(iterator)
:原迭代器中删除点会失效,其他的都不会失效。
4 总结
尾部插入一般会导致尾部迭代器失效;
头部插入一般会导致头部迭代器失效;
尾部删除一般会导致尾部迭代器失效;
头部删除一般会导致头尾迭代器失效。
5 解决
解决迭代器失效最有效直接的方法就是在进行任何可能导致迭代器失效的操作之后,重新获取迭代器