vector list迭代器失效问题

最近我遇到这样一个问题

 

 

 

   我在这希望在头插入多个4 但是我发现assert给我报了个错 说我的pos不在我规定的范围内,我这个纳闷了为啥出现这个呢 我的it不是++呢么而且也没有超过end啊。于是我就开始调试发现前两个都还是正常的,但到了第三个我发现:

 这个it指向的值变成了随机值,结合上面的代码,我想到了 原因:在我不断头插的过程中容量由充足到扩容,扩容后就会重新new一段新的空间之前的就被delete了,我原来的it还是指向被delete的空间于是就产生了随机值而且地址大小和新地址大小也不匹配了。这就是迭代器失效了,我们可以用it接受push_back的返回值(iterator)这样it就会得到该位置最新的迭代器,就不会造成失效。

那么删除的时候会不会也有这种问题呢?其实要看是如何实现删除的,如果有缩容的算法,那么就会出现这种情况,毕竟也是要把原来的空间释放开一块新的空间。

结论:insert/erase pos的位置一定不要直接访问pos,因为你不知道他是不是容量变化了,要记得先去更新一下pos,不然就会出现迭代器失效等问题。 

那么list下的迭代器也会像这样失效码?

答案是一定的。

我们知道list在扩容的时候是不会重新开辟空间扩容的,因此它在插入的算法中是不会有这种失效问题的,它只有在删除的时候才会出现,因为list的iterator是一个类,使用该节点的指针去构造它的,因此当你插入的时候你就是用插入节点的地址去构造这个迭代器 这个迭代器是不会失效的,当你删除时,你就会把这个节点的指针delete掉,当你再访问这个迭代器的时候,你就是在访问一个野指针。就会出现失效问题。因此list再使用删除操作的时候也要注意更新迭代器。避免出现失效。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值