码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2020-06-09 22:08:47      阅读:84      评论:0      收藏:0      [点我收藏+]

标签:sign   mamicode   erase   img   adl   alt   shrink   ase   位置   

 

技术图片

 

 

  

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)

标签:sign   mamicode   erase   img   adl   alt   shrink   ase   位置   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!