目录

一、反向迭代器

二、反向迭代器的实现


一、反向迭代器

之前的模拟实现vector、list 的时候,这些都是实现了正向迭代器,反向迭代器都没有实现,这里就要实现反向迭代器

反向迭代器也是适配器(配接器)的一种,反向迭代器的实现是对正向迭代器的封装,即实现的反向迭代器能支持多种容器,给出该容器的正向迭代器就能支持反向迭代器

比如 vector 需要反向迭代器,那就把 vector 的正向迭代器传给 反向迭代器,它就可以通过正向迭代器转换出 vector 的反向迭代器。

也就是说,实现的反向迭代器并包装的这个类,不是针对某个容器而是针对所有容器的,任何一个容器只要你实现了正向迭代器,就可以通过其适配出反向迭代器

要注意反向迭代器的错位访问

对于 list 而言,正向迭代器的 begin 和 end 位置如下

begin 位于头结点的下一个节点,end 则位于尾结点的下一个节点,即头节点,正向迭代器 ++ 操作,迭代器是往后走的

反向迭代器 rbegin 和 rend 位置如下

反向迭代器 rbegin() 位于正向迭代器 end() 的位置, 反向迭代器 rend() 位于正向迭代器 begin() 的位置,反向迭代器 ++操作迭代器是往前走的

vector 反向迭代器也是如此

对于 list 来说,反向迭代器解引用取数据,取的是头节点上一个节点位置的数据,vector 也是如此

二、反向迭代器的实现

Iterator.h

#pragma oncetemplate<class Iterator, class Ref, class Ptr>
class ReverseIterator
{typedef ReverseIterator<Iterator, Ref, Ptr> Self;
public:ReverseIterator(Iterator it):_it(it){}Ref operator*(){Iterator tmp = _it;return *(--tmp); //取的是上一个的数据}Ptr operator->(){return &(operator*());//取的是上一个的数据的地址}Self& operator++(){--_it;return *this;}Self& operator--(){++_it;return *this;}bool operator!=(const Self& s){return _it != s._it;}private:Iterator _it;
};

下面套到 list 里面进行测试

//反向迭代器
typedef ReverseIterator<iterator, T&, T*> reverse_iterator;
typedef ReverseIterator<const_iterator, const T&, const T*> const_reverse_iterator;

在 list 里面添加反向迭代器代码

reverse_iterator rbegin()
{return reverse_iterator(end());
}reverse_iterator rend()
{return reverse_iterator(begin());
}

测试代码

void Test_ReverseIterator()
{fy::list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);lt.push_back(5);lt.push_back(6);fy::list<int>::iterator it = lt.begin();while (it != lt.end()){cout << *it << " ";++it;}cout << endl;fy::list<int>::reverse_iterator rit = lt.rbegin();while (rit != lt.rend()){cout << *rit << " ";++rit;}cout << endl;
}

运行结果

list 的反向迭代器就完成了,下面测试 vector 的反向迭代器

把 Iterotor.h 拷贝一份到 vector 里面

//反向迭代器
typedef ReverseIterator<iterator, T&, T*> reverse_iterator;
typedef ReverseIterator<const_iterator, const T&, const T*> const_reverse_iterator;

在 vector 里面添加反向迭代器代码

reverse_iterator rbegin()
{return reverse_iterator(end());
}reverse_iterator rend()
{return reverse_iterator(begin());
}

测试代码

void Test_ReverseIterator()
{fy::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);fy::vector<int>::iterator it = v.begin();while (it != v.end()){cout << *it << " ";++it;}cout << endl;//反向迭代器fy::vector<int>::reverse_iterator rit = v.rbegin();while (rit != v.rend()){cout << *rit << " ";++rit;}cout << endl;}

运行结果

----------------我是分割线---------------

文章到这里就结束了,下一篇即将更新

【C++初阶】十二、STL---反向迭代器的实现相关推荐

  1. OpenCV学习(二十二) :反向投影:calcBackProject(),mixChannels()

    OpenCV学习(二十二) :反向投影:calcHist(),minMaxLoc(),compareHist() 参考博客: 反向投影backproject的直观理解 opencv 反向投影 颜色直方 ...

  2. 【C++】STL——反向迭代器的模拟实现:迭代器适配器

    文章目录 前言 1. list 的反向迭代器模拟实现 2. 思考 3. 库里面反向迭代器的实现--迭代器适配器 4. 反向迭代器模拟实现的改进--适配器模式 5. 适配器模式的实现--一劳永逸 6. ...

  3. 【C++初阶】二、类与对象(中篇)

    目录 一.类的6个默认成员函数 二.构造函数 2.1 构造函数概念 2.2 构造函数的特性 三.析构函数 3.1 析构函数的概念 3.2 析构函数的特性 四.拷贝构造函数 4.1 拷贝构造函数概念 4 ...

  4. CentOS 初体验十二:wget下载文件

    转载请注明出处http://blog.csdn.net/zhaoyanjun6/article/details/79108129 本文出自[赵彦军的博客] wget命令 wget命令用来从指定的URL ...

  5. JavaScript初阶(二)

    编程形式的区别 编程语言按形式上分为两类,第一是面向过程,第二是面向对象. 面向过程:每一步我们该怎么做,如C语言 面向对象:包含面向过程,但更重要的是用什么方法处理,结构化更强. 显示类型转换 ty ...

  6. UE4开发神秘海域类游戏原型 初阶(二):动画资源的整合

    前一篇已经确定神海类游戏原型的目标,首先要做的就是3C's(Character, Controls, Camera)的开发. UE4的3C's的程序部分开发主要也就是基于他的GamePlay Fram ...

  7. 【C++】STL中 list 反向迭代器的模拟实现

    在上篇文章实现了 list 后,我们实现了其对应的迭代器,但是对于 list,还有一个反向迭代器我们呢没有实现,但是反向迭代器不仅仅可以在 list 中使用,在 vector 中我们进行适配,同样也可 ...

  8. C++【STL】【反向迭代器】

    目录 一.反向迭代器的简介 1.什么是反向迭代器 2.方向迭代器的实现 二.反向迭代器的相关问题 1.为什么在operator*中需要--迭代器 2.适配list的反向迭代器 3.适配vector的反 ...

  9. 【C++】迭代器、反向迭代器详解

    参考: http://c.biancheng.net/view/338.html https://blog.csdn.net/kjing/article/details/6936325 https:/ ...

最新文章

  1. xcode 4.5 new feature __ ios6 新特性
  2. 6 redis 编译失败_Centos7.8环境搭建Redis主从复制和哨兵模式
  3. 计算机四级网络工程题库,2015计算机四级网络工程师模拟题库(三)附答案
  4. Python学习之路_day_11(装饰器)
  5. 用友中标:打造新一代云化ERP 落地大型企业互联网+
  6. python实现元胞自动机
  7. linux设备连接磁带机,Linux磁带机设备绑定
  8. 记录自建ALIDDNS服务域名解析和外网访问
  9. ConneR and the A.R.C. Markland-N
  10. gds是什么系统简称_气体检测仪GDS系统是什么系统?
  11. 放苗机器人_机自学院苗中华教授团队在集群机器人智能控制研究方面取得重大进展...
  12. harbor 安装启动遇到的keng
  13. 在java中如何做身份证号码校验
  14. dedecms 栏目绑定二级域名
  15. 【音乐】如果历史是一群喵主题曲钢琴弹奏
  16. 计算三维空间中直线和三角形的交点
  17. vuejs-- webpack环境下父子组件的使用
  18. Qt之调用FFTW3实现音频频谱(原理)
  19. 体育类素质赛道升温,迎来转型时机
  20. 8大模块、40个思维模型,打破思维桎梏,满足你工作不同阶段、场景的思维需求,赶紧收藏慢慢学

热门文章

  1. CSpreadSheet类学习(操作EXCEL)
  2. 有关有符号(signed)和无符号(unsigned)的典型例题
  3. 记忆大师(记忆练习/学习记忆/增强记忆)
  4. 生成树协议STP、RSTP和MSTP原理的理解
  5. [golang gin框架] 24.Gin 商城项目-redis讲解以及操作
  6. 本地加载mnist数据集的方法
  7. 输出的1~100的奇数的解法
  8. #react#找不到模块“react/jsx-runtime”或其相应的类型声明。ts(2307)
  9. 计算机主机电源连接,电脑线连接方法介绍 台式机电脑如何正确接线
  10. 项目管理 | 什么是项目管理计划?