C++迭代器失效的几种情况
1. 对于序列型容器:vector, deque
- 删除当前元素:从当前位置到之后全部位置迭代器失效;(可以用 it=res.erase(it); 来实现迭代器的更新追踪)
- 添加一个元素:当添加元素后,导致了容器扩容的操作,则全部迭代器失效;(可以用 it=res.push(it);)
- 插入一个元素:当添加的元素在首尾位置以外,所有迭代器均失效;(在首位添加元素会导致迭代器失效,但是指针和引用不会失效;)(在首位或者尾位删除元素会导致被删除元素的迭代器失效;)
2. 对于关联型容器:map, set
- 删除当前的元素,仅仅会使当前的迭代器失效,删除一个结点不会对其他结点造成影响。(map是关联容器,以红黑树或者平衡二叉树组织数据,虽然删除了一个元素,整棵树也会调整,以符合红黑树或者二叉树的规范,但是单个结点在内存中的地址没有变化,变化的是各个结点之间的指向关系)
3. 对于链表型容器:list
- 删除运算使指向删除位置的迭代器失效,不会使其他迭代器失效。