【C++初阶】反向迭代器的实现

在这里插入图片描述

👦个人主页:@Weraphael
✍🏻作者简介:目前学习C++和算法
✈️专栏:C++航路
🐋 希望大家多多支持,咱一起进步!😁
如果文章对你有帮助的话
欢迎 评论💬 点赞👍🏻 收藏 📂 加关注✨


一、什么是迭代器

迭代器是一个类型,相当于容器和算法之间的中介。它可以访问容器中的任意元素,而不需要了解容器的内部实现细节。因此,迭代器可以认为是指针,但不一定就是指针。

特别注意:容器stackqueuepriority_queue是不支持迭代器的

二、迭代器的分类

常见的迭代器有正向迭代器和反向迭代器

【正向迭代器】
在这里插入图片描述

  • ++是从前往后遍历
  • --是从后往前遍历

【反向迭代器】

在这里插入图片描述

  • ++是从后往前遍历
  • --是从前往后遍历

三、如何模拟实现反向迭代器

对比正向迭代器和反向迭代器,只有前后置++/--是有所差别的

  • 对于list可以将原来的正向迭代器给拷贝一份,然后将++运算符重载中修改为指向前一个结点,--运算符重载修改为指向后一个结点。
  • 对于vector可以是类似于实现list正向迭代器一样,封装一个类,,然后运算符重载去处理。

可是以上这样实现就有点冗余,我们可以看看库是如何实现的

在这里插入图片描述

从上我们可以发现,库中其实使用的是 适配器来实现反向迭代器:**对正向迭代器进行封装适配出反向迭代器。

  • 用正向迭代器的++实现反向迭代器的--
  • 用正向迭代器的--来实现反向迭代器的++

接下来再来看看库里是如何实现reverse_iterator

在这里插入图片描述

以上接口唯独最奇怪的是 解引用它解引用的是当前位置的前一个对象(*--tmp),但是再回过头重新看rbeginrend就会明白

在这里插入图片描述

每次解引用都会先得到rbegin前一个位置的数据,直到rbegin == rend遍历结束,这里就体现了一个镜像对称特性,反向迭代器与正向迭代器是具有对称关系的

四、代码实现

在这里插入图片描述

接下来以vector为例来测试以上的代码是否正确。当然首先需要定义反向迭代器

在这里插入图片描述

【测试结果】

在这里插入图片描述

五、Gitee仓库地址

本篇博客相关代码:点击跳转

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值