迭代器失效

发布时间:2024年01月21日

迭代器失效

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大部分使用迭代器的接口的返回值都是迭代器,所以可以在每一次进行操作之后用返回值对迭代器重新赋值,如下:

在这里插入图片描述

文章来源:https://blog.csdn.net/m0_75062065/article/details/135712942
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。