【C++】探讨迭代器的秘密 和 迭代器失效问题(学精、学好必知)

🏠大家好,我是 兔7 ,一位努力学习C++的博主~💬

🍑如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀

🚀如有不懂,可以随时向我提问,我会全力讲解~

🔥 如果感觉博主的文章还不错的话,希望大家关注、点赞、收藏三连支持一下博主哦~!

🚀本文章CSDN首发

目录

0.前言

1. 迭代器是什么

2. 迭代器的用法

3. 迭代器那层迷雾

3.1 while (it != v.end()) 问题

3.2 范围for 问题

3.3 迭代器失效 问题(重点)

3.3.1 迭代器失效的概念:

问题一:意义变了

问题二:变成野指针了

3.3.2 小试牛刀进行检测:

3.3.3 如何解决迭代器失效:

4. 实现


0.前言

        此博客为博主以后复习的资料,所以大家放心学习,总结的很全面,每段代码都给大家发了出来,大家如果有疑问可以尝试去调试。

        大家一定要认真看图,图里的文字都是精华,好多的细节都在图中展示、写出来了,所以大家一定要仔细哦~

        感谢大家的喜欢,感谢大家的支持~!

1. 迭代器是什么

        迭代器(iterators)是一个超级接口! 是可以遍历集合的对象,为各种容器提供了公共的操作接口,隔离对容器的遍历操作和底层实现,从而解耦。

        迭代器是类似指针一样的东西,因为它的用法就是模拟指针,但是它不是指针。

        迭代器是行为型 设计模式 ,提供了一种方法来遍历一个聚合的容器(集合)中的各个元素,而不用暴露其内部的表示。

        对于容器的访问而不需要关注容器内部的实现细节,可以使用迭代器,

        也就是说,不管你是什么容器,都可以用迭代器进行遍历操作和底层实现。

2. 迭代器的用法

int main()
{
	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);
	v.push_back(5);
	v.push_back(6);
	vector<int>::iterator it = v.begin();
	while (it != v.end())
	{
		cout << *it << " ";
		it++;
	}
	return 0;
}

        这就是迭代器的使用方法,有的小伙伴直接将这段代码当作迭代器的公式进行记忆,这样其实是错误的!屏幕前的小伙伴如果也是将这段代码当作迭代器的公式进行记忆的话,可能会反驳我:你也这么写,我也这么写,而且都是对的,你凭什么说我这么记下来是错的?

        那我问问大家,迭代器的循环条件可以写成 while (it < v.end()) 么?可以的话,为什么可以?不可以的话,又是为什么呢?

        如果不是很清楚,那么继续向下看~

3. 迭代器那层迷雾

3.1 while (it != v.end()) 问题

        其实迭代器的循环条件有时可以写成while (it < v.end()),有时就不行。我说这个答案,大家可能会有点迷惑,为什么有时就可以有时就不可以呢,要明白这个问题,就先要清楚迭代器。

         前面说过迭代器是类似指针一样的东西,因为它的用法就是模拟指针,但是它不是指针。那么大家先来想想,指针可以比较大小么?答案是肯定的,当然可以比较大小啊,但是有一个限定条件就是用指针比较大小的时候,这两个指针在物理空间上是要连续的,也就是像数组那样比较指针的大小。

        当然,这里的再前提条件就是比较大小要有意义。如果没有意义,为了比较大小而比较大小,那就随意了。所以是在有意义的前提下的。

        现在我先来公布上面问题的答案:

        在vector这个容器是可以的,可以的原因是:vector的底层实现就是用指针来实现它的迭代器,而且它的物理空间也是在空间上连续的,也就是下图所示:

评论 77
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

NPC Online

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

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

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

打赏作者

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

抵扣说明:

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

余额充值