回顾

对于STL中的容器,迭代器(iterator)是很重要的部分,同时迭代器也是STL六大组件之一,在之前我们实现vector和list中,我们已经对于迭代器有了初步的认识,为什么设计迭代器? 就是为了能像数组中的指针一样,可以通过++ , -- 的操作遍历数据。

比如说vector,它本身底层就是一个数组,一串连续的数据,而它的迭代器就是原生指针。

而list,它并不是连续存储的空间,但是可以通过每个节点的_next指针找到下一个节点(数据),而它的迭代器是一个类,类的底层成员是节点指针,再重载++,--操作,就能像vector一样遍历数据。

反向迭代器(reverse_iterator)

反向迭代器,就是迭代器(正向迭代器)的反过来遍历,从尾部向头部遍历,这个不难理解。

正向迭代器,我们知道,它是一个左闭右开的区间,那么反向迭代器,是怎么样的一个区间呢?

这个问题我们先放着,大家可以思考一会。

如果我们要实现一个反向迭代器,是否又要写一个反向迭代器的实现?这是否会与我们实现的正向迭代器的代码大幅度相似? 对于STL来说,太多重复的代码会显得很臃肿浪费,那么STL是如何实现反向迭代器的呢?

STL对于反向迭代器的实现,采用了适配器的做法,对正向迭代器进行了封装。而对于适配器,我们已经了解了stack,queue等。所以,反向迭代器,不仅仅是迭代器,还是适配器!

反向迭代器作为适配器适配在什么地方?STL让能支持逆序遍历的容器都能把各自的正向迭代器适配出各自的反向迭代器!

template<typename Iterator , typename Ref, typename Ptr>struct __reverse_iterator {typedef __reverse_iterator<Iterator, Ref, Ptr> RIterator;Iterator _data;    //成员变量__reverse_iterator(Iterator it):_data(it){}};

这里模版的第一个参数是你需要适配的正向迭代器,第二个和第三个参数与正向迭代器一致,是用来识别判断你这个迭代器是否是const的。

怎么反向遍历?不过是把正向迭代器的++操作,替换成了--操作!

RIterator& operator++()
{--_data;return *this;
}RIterator operator++(int)
{__reverse_iterator tmp(_data);--_data;return tmp;
}RIterator& operator--()
{++_data;return *this;
}RIterator operator--(int)
{__reverse_iterator tmp(_data);++_data;return tmp;
}

反向迭代器区间

那么已经知道了反向迭代器的运作原理,是否对于它的遍历区间有了一些猜想?

而STL是这样设计的

以vector为例

Ref operator*()
{Iterator tmp = _data;return *(--tmp);
}Ptr operator->()    //针对自定义类型指针访问成员
{return &(operator*());
}bool operator!=(const RIterator& it)
{return _data != it._data;
}

RIterator rbegin()
{return RIterator(end());
}const_RIterator rbegin() const
{return RIterator(end());
}RIterator rend()
{return RIterator(begin());
}const_RIterator rend() const
{return RIterator(begin());
}

而反向迭代器的遍历则是这样

vector<int> v1;
v1.push_back(1);
v1.push_back(2);
v1.push_back(3);
v1.push_back(3);
v1.push_back(3);
v1.push_back(6);
v1.push_back(4);
vector<int>::RIterator Rit = v1.rbegin();
while (Rit != v1.rend())
{cout << *Rit << " ";++Rit;
}
cout << endl;

反向迭代器不仅仅是迭代器,还是一个适配器,写一个反向迭代器就能造福许多容器,为什么是许多而不是全部?  因为有些容器的迭代器不支持--操作,就比如单向链表,不支持逆序遍历。

STL-reverse_iterator 反向迭代器相关推荐

  1. C++ [STL容器反向迭代器]

    本文已收录至<C++语言和高级数据结构>专栏! 作者:ARMCSKGT STL容器反向迭代器 前言 正文 适配器 反向迭代器 反向迭代器框架 默认成员函数 反向迭代器的遍历 反向迭代器的比 ...

  2. c++STL的反向迭代器

    反向迭代器 反向迭代器是一种反向遍历容器的迭代器.也就是,从最后一个元素到第一个元素遍历容器.反向迭代器将自增(和自减)的含义反过来了:对于反向迭代 器,++ 运算将访问前一个元素,而 – 运算则访问 ...

  3. C++进阶——反向迭代器Reverse_iterator

    C++进阶--反向迭代器Reverse_iterator Reverse_iterator反向迭代器介绍 之前我们学过适配器,但是只实现了普通的迭代器,可是反向迭代器没有实现,当时说之后会实现的,没错 ...

  4. 反向迭代器和正向迭代器

    文章目录 反向迭代器和正向迭代器 1. 正向迭代器 1.1 list结构 1.2 list代码框架 1.3 代码结合框架 1.3.0 list_node类 1.3.1 list类 1.3.2 list ...

  5. 【C++】反向迭代器

    文章目录 一.什么是反向迭代器 二.STL 源码中反向迭代器的实现 三.reverse_iterator 的模拟实现 四.vector 和 list 反向迭代器的实现 一.什么是反向迭代器 C++ 中 ...

  6. 【C++】反向迭代器的设计

    +前言 STL中不少的容器需要有迭代器这样的设计,特别是正向迭代器,几乎每个容器都有自己的特定实现方式,有了正向迭代器之后,我们还要提供反向迭代器以供一些特殊的需求,但是许多容器的正向迭代器实现的方式 ...

  7. 【C++】反向迭代器的实现

    文章目录 1.迭代器的分类 2.反向迭代器的使用 3.反向迭代器的模拟实现 4.list类的反向迭代器实现 1.迭代器的分类 我们随便打开一个容器,看迭代器相关的接口,都可以发现,支持迭代器的容器,其 ...

  8. 反向迭代器(rbegin,rend)详解

    反向迭代器详解 stl中如何设计反向迭代器 反向迭代器顾名思义就是帮助容器从后向前遍历的一种迭代器,有const和非const版本区别,利用模板可以实现两种版本代码的复用 stl中反向迭代器的设计使用 ...

  9. 【STL源码剖析】list模拟实现 | 适配器实现反向迭代器【超详细的底层算法解释】

    今天博主继续带来STL源码剖析专栏的第三篇博客了! 今天带来list的模拟实现! 话不多说,直接进入我们今天的内容! 前言 那么这里博主先安利一下一些干货满满的专栏啦! 手撕数据结构https://b ...

最新文章

  1. 简单创建序列和触发器示例
  2. 服务器操作系统2008安装图解,IBM服务器windows2008操作系统安装步骤图文(13页)-原创力文档...
  3. 关于waf的一些随想
  4. vue 本地环境API代理设置和解决跨域
  5. 1451 - Average 高速求平均值
  6. Quartz.NET simple_demo
  7. python做物联网控制_python实现NB-IoT模块远程控制
  8. centos8搭建nsis交叉编译环境
  9. Node.js:node项目中连接postgresql以及基础使用
  10. lfs库下载_git-lfs插件
  11. 软件基本功:工作目标经常变化,要及时跟进
  12. 图层重命名快捷键_实际操作,在PS中如何批量给图层重命名并导出
  13. 设计原则:单一职责(SRP)原则
  14. 什么是抽样平均误差?
  15. 数据分析(Python)贡献度分析——帕累托法则
  16. 十种深度学习算法要点及代码解析(转)
  17. 微信小程序编译时警告:Component “pages/test2/test2“ does not have a method “ getData“ to handle event “t
  18. 淘宝/天猫官方商品/订单订单API接口
  19. 浅谈HEVC中的CTU CU PU TU
  20. js-图片的轮播-设置主要界面-和鼠标点击进行切换图片

热门文章

  1. Java实现定时任务方法之Quartz
  2. 如何写好一个部门的年终总结
  3. Java毕设项目基于的电商平台的设计与实现(java+VUE+Mybatis+Maven+Mysql)
  4. [LeetCode] 620.Not Boring Movies
  5. 客户端Git代码的下载与提交
  6. wifi和AP共存方案研究--Android8.0
  7. Cvae-gan: fine-grained image generation through asymmetric training论文阅读笔记
  8. import java.awt.BorderLayout;_import java.awt
  9. 迅捷CAD编辑器哪些功能比较好用
  10. 武忠祥每日一题知识点总结