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() 。 |
insert, emplace | 若 vector 更改容量,则为其全部。否则仅为在或于插入点后者(包括 end() )。 |
resize | 若 vector 更改容量,则为其全部。否则仅 end() 与被擦除元素。 |
pop_back | 被擦除元素及 end() 。 |
4.list
在 list 内或在数个 list 间添加、移除(remove)和移动元素不会非法化迭代器或引用。迭代器仅在对应元素被删除时非法化(erase)
erase指向被擦除元素的迭代器和引用被非法化。其他引用和迭代器不受影响。
5.deque
新战场:https://blog.csdn.net/Stephen___Qin