迭代器失效的问题——基于vector

迭代器的主要作用就是让算法能够不用关心底层数据结构,其底层实际就是一个指针,或者是对指

针进行了封装,比如:vector的迭代器就是原生态指针T* 。因此迭代器失效,实际就是迭代器底层

对应指针所指向的空间被销毁了,而使用一块已经被释放的空间,造成的后果是程序崩溃(即如果

继续使用已经失效的迭代器, 程序可能会崩溃)。

此时的resize引起了vector的扩容,那么原本的迭代器就会失效,因为it还是使用的扩容前的旧空间,打印的时候就是使用的就空间,导致运行的崩溃。类似的操作还有reserve、insert、erase、assign等。

解决方式是,在更新新的空间后重新给迭代器it赋值。

一般而言erase不会导致失效,但是当pos的位置是最后一个元素时,删除了pos位置的元素,pos

就失效了,此时打印pos位置失败。因此删除vector中任意位置上元素时,vs就认为该位置迭代器

失效了。

可以看到当a.erase(it)的时候,迭代器又失效了,因为空间的变化导致it没有更新,所以无法完

成后续的代码。

此时把it++放在else的外面又会报错,因为it更新后的位置就是下一个元素的位置,所以不能把

it++放在条件判断的后面,比如在最否erase(6)的时候,it++会导致越界。

 

此时程序的运行没有问题。

在linux迭代器问题汇总:

1. 扩容之后,迭代器已经失效了,程序虽然可以运行,但是运行结果已经不对了。

2. erase删除任意位置代码后,linux下迭代器并没有失效。因为空间还是原来的空间,后序元素往

前搬移了,it的位置还是有效的。

3: erase删除的迭代器如果是最后一个元素,删除之后it已经超过end。此时迭代器是无效的,++it

导致程序崩溃。

与vector类似的是,string的插入扩容和erase删除数据也会导致迭代器的失效。

所以需要对迭代器重新赋值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青山是哪个青山

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值