reverse_iterator反向迭代器的实现

反向迭代器是一种用于数据结构反向遍历的工具,其行为与正向迭代器相反。在C++中,通过重载++和--操作符可以实现反向迭代器。文章讨论了如何实现反向迭代器,特别是解决解引用操作的问题,以及在双向迭代器中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

看似简单的东西,其实复杂。

看似复杂的东西,其实简单。


什么。是反向迭代器?顾名思义,对数据的反方向遍历,与正向迭代器做的事情相同,运动行为相反。

list正向迭代器运行轨迹

 

 我们的利用迭代器遍历我的list是都是从(1)遍历的(5)最后it指向head,结束遍历。

而反向迭代器是不同的遍历顺序。

反向迭代器遍历反向是由数据(5)遍历到(1)的。(不一定rit指向head是结束)

如果重新写list反向迭代器,是没有必要的,我们会发现我们的反向迭代器行为是与正向相反的

我们可以将指向迭代器进行复用,实现反向迭代器。

		self&operator++()
		{
			_it--;//反向迭代器的++就是正向迭代器的--
			return *this;
		}

		self& operator--()
		{
			_it++;//反向迭代器的--就是正向迭代器的++
			return *this;
		}

根据我们的认为下(我真的是只有认为)rend()、end()、begin()、rbegin(),是这样的指向设计。

但是大佬喜欢对称。

 将我们的反向迭代器指向改成了这样,那么我们的访问数据这是个问题。

  reference operator*() const {
    return *_it;
  }//错误的访问!!!!!

 所以大佬对我们的解引用运算符重载做了特殊处理

 所以我们需要处理解引用操作

  reference operator*() {
    Iterator tmp = it;
    return *(--tmp);//解引用不移动指针,所以创建新对象,新对象移动解引用
  }

 只要是允许双向迭代器(bidirectional iterator)都是这样使用反向迭代器的。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

云的小站

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

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

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

打赏作者

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

抵扣说明:

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

余额充值