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

Posted stephen-qin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

 

以上是关于STL迭代器失效问题(待进一步补充,当前仅总结vector和list)的主要内容,如果未能解决你的问题,请参考以下文章

C++详解stl迭代器 (vector迭代器失效问题)

[ C++ ] STL_vector -- 迭代器失效问题

面试中常被问到STL迭代器失效问题

c++ STL 迭代器失效问题

STL容器迭代器失效问题讨论

STL相关总结(待补充)