STL迭代器失效问题(待进一步补充,当前仅总结vector和list)

1.为何vector的push_back/insert操作可能会导致迭代器失效?

如果vector的push_back/insert操作导致vector需要改变它的capacity时,会在另一块较大的内存区域去分配新的空间(一般是原来空间的2倍),并把原来位置的内容拷贝过来,最后再把原来位置的存储给释放掉.位置发生了改变,会导致迭代器失效.

不过如果插入操作不改变它的capacity时:

  对于push_back,尾后迭代器(end)会失效;

  而对于insert操作,其前面的迭代器和引用不会失效,而其后的迭代器都会失效(包括尾后迭代器).

2.vector的erase操作:

非法化位于擦除点或之后的迭代器,包含 end() 迭代器。

假如擦除位置是p,则擦除后p指向了它原先对应元素的后一个元素,如果p是最后一个元素,则擦除后指向了end.

 

3.vector的迭代器非法化

操作非法化
所有只读操作 决不
swap 、 std::swap end()
clear 、 operator= 、 assign 始终
reserve 、 shrink_to_fit 若 vector 更改容量,则为其全部。否则为无。
erase 被擦除元素及之后的所有元素(包括 end() )。
push_back 、 emplace_back 若 vector 更改容量,则为其全部。否则仅 end() 。
insertemplace 若 vector 更改容量,则为其全部。否则仅为在或于插入点后者(包括 end() )。
resize 若 vector 更改容量,则为其全部。否则仅 end() 与被擦除元素。
pop_back 被擦除元素及 end() 。

4.list

在 list 内或在数个 list 间添加、移除(remove)和移动元素不会非法化迭代器或引用。迭代器仅在对应元素被删除时非法化(erase)

erase指向被擦除元素的迭代器和引用被非法化。其他引用和迭代器不受影响

5.deque

原文地址:https://www.cnblogs.com/Stephen-Qin/p/13080863.html