STL容器分为序列式容器和关联式容器:
- 序列式容器:
- vector、list、queue、deque等
- 关联式容器:
- set、map、unordered_map、unordered_map等
对于序列式容器(list除外),对某节点操作时,会使对应节点及其后续迭代器失效
- vector
- push_back():在元素末尾添加元素,当还有空间时,只会使尾迭代器失效。当空间已满,会将原数组拷贝到扩容后的新数组,使原迭代器全部失效。
- pop_back():尾删除,会使尾迭代器失效。
- insert():当有剩余空间时,会使插入点及以后的迭代器失效,无剩余空间时,所有迭代器全部失效
- erase():删除点及其以后的迭代器全部失效
- deque
- push_back():使尾迭代器失效
- push_front():使头迭代器失效
- pop_back():使尾迭代器失效
- pop_front():使头迭代器失效
- insert()和erase():判断插入或删除点前后的元素数量,如果前方元素数量较少,则将前方所有元素向前移动,使插入点及其以前的迭代器全部失效。如果后方元素数量较少,则将后方所有元素向后移动,使插入点及其以后的迭代器全部失效。
- list
- 由于list是用指针连接各个节点的,所以对节点进行操作时,只会使当前的迭代器失效,不会影响其他迭代器。
- 关联式容器
- 同list,只会影响当前节点的迭代器,不会对其他迭代器产生影响。
erase()函数使用后迭代器的变化
- 序列式容器
- 使用后返回下一个迭代器,则使用时应该 ite=vec.erase(ite);
- 关联式容器
- 使用后不返回下一个迭代器,需要ite++ ,s.erase(ite++);
Q.E.D.