迭代器失效

本文介绍了迭代器失效的概念,探讨了其产生的原因(如扩容和删除操作),以及如何通过及时更新迭代器来避免程序崩溃。着重讲解了在容器操作后正确处理迭代器的方法。
摘要由CSDN通过智能技术生成

迭代器失效

1、什么是迭代器失效

简介:

迭代器(iterator)是一种用来访问容器的工具(其底层就是一个指针、或者是一个被封装的指针),对于每种容器,STL都会提供对应的迭代器,而我们对这些容器内容的访问,就转变成对迭代器的遍历,进而实现对于不同容器内元素的访问方式统一

失效:

当用迭代器访问了某个元素并进行了某种操作后,这个迭代器(指针)访问的空间被销毁了,如果继续对其进行访问,则会导致程序崩溃。这种情况就称为迭代器失效


2、为什么会有迭代器失效

迭代器失效的原因是因为底层空间的变化,如

1、一些可能会导致扩容的函数:

resize、reserve、insert、push_back...

以上函数皆有可能导致空间的扩容,其失效的主要原因是:本地空间被释放

在这里插入图片描述

上图中:
it_before是在空间发生变化前的迭代器,指向变化之前的空间位置
it_after是空间发生扩容后的迭代器,通过调试发现其和it_before指向的位置不一样,这就是发生了迭代器的失效,此时如果还用旧的迭代器去访问,程序就会崩溃

2、一些删除操作:

erase

erase操作执行后,这个迭代器会指向被删除元素的下一个元素

此类删除操作看似没有问题,但是如果erase删除的是最后一个元素,那么下一个元位置就是end(),再对end()进行访问,程序就会崩溃( 因为 begin() 和 end() 是左闭右开,所以end()位置是非法位置 )

在这里插入图片描述

上图中:v中只有一个元素,而删除该元素后,it顺位指向了end()位置,而对该位置访问是非法的,所以程序就会崩溃


如何解决迭代器失效

1、当存在容器容量的变化时,应确保迭代器及时更新。可在每一次更改容量后都使迭代器重新指向容器

2、由于STL大部分使用迭代器的接口的返回值都是迭代器,所以可以在每一次进行操作之后用返回值对迭代器重新赋值,如下:

在这里插入图片描述

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值