STL容器分为序列式容器和关联式容器:

  • 序列式容器:
    • vector、list、queue、deque等
  • 关联式容器:
    • set、map、unordered_map、unordered_map等

对于序列式容器(list除外),对某节点操作时,会使对应节点及其后续迭代器失效

  1. vector
    1. push_back():在元素末尾添加元素,当还有空间时,只会使尾迭代器失效。当空间已满,会将原数组拷贝到扩容后的新数组,使原迭代器全部失效。
    2. pop_back():尾删除,会使尾迭代器失效。
    3. insert():当有剩余空间时,会使插入点及以后的迭代器失效,无剩余空间时,所有迭代器全部失效
    4. erase():删除点及其以后的迭代器全部失效
  2. deque
    1. push_back():使尾迭代器失效
    2. push_front():使头迭代器失效
    3. pop_back():使尾迭代器失效
    4. pop_front():使头迭代器失效
    5. insert()和erase():判断插入或删除点前后的元素数量,如果前方元素数量较少,则将前方所有元素向前移动,使插入点及其以前的迭代器全部失效。如果后方元素数量较少,则将后方所有元素向后移动,使插入点及其以后的迭代器全部失效。
  3. list
    1. 由于list是用指针连接各个节点的,所以对节点进行操作时,只会使当前的迭代器失效,不会影响其他迭代器。
  4. 关联式容器
    1. 同list,只会影响当前节点的迭代器,不会对其他迭代器产生影响。

erase()函数使用后迭代器的变化

  • 序列式容器
    • 使用后返回下一个迭代器,则使用时应该 ite=vec.erase(ite);
  • 关联式容器
    • 使用后不返回下一个迭代器,需要ite++ ,s.erase(ite++);

Q.E.D.