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

Reverse_iterator反向迭代器介绍

之前我们学过适配器,但是只实现了普通的迭代器,可是反向迭代器没有实现,当时说之后会实现的,没错就是今日,我们要收复Reverse_iterator-----stl-list。
我们其实可以封装一个反向迭代器库(Reverse_iterator.h),这样不管是什么容器(适配器)都可以使用了,减少了代码的冗余。

反向迭代器的实现

底层实现

用正向迭代器就可以封装出来一个反向迭代器,这也是体现了复用

template<class Iterator, class Ref, class Ptr>struct Reverse_iterator{typedef Reverse_iterator<Iterator, Ref, Ptr> self;Iterator _it;Reverse_iterator(Iterator it):_it(it){}}

解引用的实现

这其实是利用了之前学过的list的思想,用一个Ref实现引用(可以是const对象,也可以是普通的对象),Ptr也一样可以是 const指针,也可以是普通指针。

     //template<class Iterator, class Ref, class Ptr>Ref operator*(){Iterator tmp = _it;return *--tmp;}Ptr operator->()//重中之重{return &(operator*());}

而且这里的 - > 还可以复用operator*()

迭代器的自加自减

反向迭代器的 + 就是正向迭代器的 - 所以只要函数重载就可以了

     //前置self& operator++(){--_it;return *this;}self& operator--(){++_it;return *this;}//后置self operator++(int){self tmp = *this;--_it;return tmp;}self operator--(int){self tmp = *this;++_it;return tmp;}

判断符号重载

迭代器不需要比较大小,只需要比较等于和不等于
比较的还是迭代器(地址)

     bool operator!=(const self& s){return _it != s._it;}bool operator==(const self& s){return _it == s._it;}

完整代码实现

#pragma once
namespace tom
{// 适配器 -- 复用template<class Iterator, class Ref, class Ptr>struct Reverse_iterator{typedef Reverse_iterator<Iterator, Ref, Ptr> self;Iterator _it;Reverse_iterator(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;}//后置self operator++(int){self tmp = *this;--_it;return tmp;}self operator--(int){self tmp = *this;++_it;return tmp;}bool operator!=(const self& s){return _it != s._it;}bool operator==(const self& s){return _it == s._it;}}

各个容器的实现

vector迭代器

vector迭代器的实现

// 正向迭代器typedef T* iterator;typedef const T* const_iterator;// 正向迭代器iterator begin(){return _start;}iterator end(){return _finish;}const_iterator begin() const{return _start;}const_iterator end() const{return _finish;}

vector反向迭代器的实现
反向迭代器为了对称把正向迭代器的end当成了反向迭代器的rbegin;把正向迭代器的begin当成了反向迭代器的rend。

// 反向迭代器typedef Reverse_iterator<iterator, T&, T*> reverse_iterator;typedef Reverse_iterator<const_iterator, const T&, const T*> const_reverse_iterator;// 反向迭代器const_reverse_iterator rbegin() const{return const_reverse_iterator(end());}const_reverse_iterator rend() const{return const_reverse_iterator(begin());}reverse_iterator rbegin() {return reverse_iterator(end());}reverse_iterator rend(){return reverse_iterator(begin());}

list迭代器

list迭代器的实现

// 正向迭代器typedef __list_iterator<T, T&, T*> iterator;typedef __list_iterator<T, const T&, const T*> const_iterator;// 正向迭代器iterator begin(){return iterator(_head->_next);}iterator end(){return iterator(_head);}const_iterator begin() const{return const_iterator(_head->_next);}const_iterator end() const{return const_iterator(_head);}

list反向迭代器的实现
反向迭代器为了对称把正向迭代器的end当成了反向迭代器的rbegin;把正向迭代器的begin当成了反向迭代器的rend。

// 反向迭代器typedef Reverse_iterator<iterator, T&, T*> reverse_iterator;typedef Reverse_iterator<const_iterator, const T&, const T*> const_reverse_iterator;// 反向迭代器const_reverse_iterator rbegin() const{return const_reverse_iterator(end());}const_reverse_iterator rend() const{return const_reverse_iterator(begin());}reverse_iterator rbegin() {return reverse_iterator(end());}reverse_iterator rend(){return reverse_iterator(begin());}

反向迭代器都是对正向迭代器的复用
反向迭代器------以下下代码可以粘贴到任意容器中,这样就可以一次性实现反向迭代器了

 反向迭代器------以下下代码可以粘贴到任意容器中,这样就可以一次性实现反向迭代器了//typedef Reverse_iterator<iterator, T&, T*> reverse_iterator;//typedef Reverse_iterator<const_iterator, const T&, const T*> const_reverse_iterator; 反向迭代器//const_reverse_iterator rbegin() const//{//    return const_reverse_iterator(end());//}//const_reverse_iterator rend() const//{//  return const_reverse_iterator(begin());//}//reverse_iterator rbegin()//{//  return reverse_iterator(end());//}//reverse_iterator rend()//{//    return reverse_iterator(begin());//}};// vector和list反向迭代器实现

C++进阶——反向迭代器Reverse_iterator相关推荐

  1. 反向迭代器reverse_iterator模拟实现

    准备工作 相同的命名空间可以分割在不同的文件中,编译器最后都会合成在同一个命名空间下. 我们的reverse_iterator是个适配器,为什么叫适配器,是因为它需用正向迭代器做适配.简言之,反向迭代 ...

  2. Vector反向迭代器使用

    反向迭代器 1 反向迭代器其实没什么特殊的,他只是在遍历的方向上和普通迭代器不通而已:每一个容器里面都有Iterator(迭代器),可以从容器的begin位置到end-1位置,通过++来遍历.同样也有 ...

  3. 插入迭代器、流迭代器、反向迭代器、移动迭代器

    文章目录 前言 插入迭代器 inserter front_inserter back_inserter iostream迭代器 istream_iterator 读取输入流 istream_itera ...

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

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

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

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

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

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

  7. 【C++】模拟实现List的正向和反向迭代器(iterator、reverse_iterator)

    文章目录 1.搭建List的基本框架 2.List中iterator和const_iterator 3.反向迭代器revser_iterator 1.搭建List的基本框架 STL中List容器底层是 ...

  8. 迭代器和反向迭代器,常量迭代器和非常量迭代器

    迭代器的类型共有4种:<T>::Iiterator,<T>::const_iterator,<T>::reverse_iterator,<T>::con ...

  9. std::string中的反向迭代器rbegin()和rend()

    在std::string中,有个接口是rbegin()和rend(),分别表示string字符串的倒数第一个字符和正数第一个字符: rbegin():表示string字符串的倒数第一个字符 rend( ...

最新文章

  1. 用C#实现的条形码和二维码编码解码器
  2. Python控制流---while循环
  3. C#自定义工业控件开发
  4. 百度地图动态插入标注
  5. K8S原来如此简单(一)K8S核心组件与基本原理
  6. html 模糊匹配,CSS 属性选择器 模糊匹配的使用
  7. Docker部署MySQL监控工具Lepus
  8. Oracle增加临时表空间
  9. iOS定位-核心定位框架CLLocation
  10. 跨境erp系统功能分析
  11. (附源码)计算机毕业设计ssm大学生体检管理系统
  12. 2023真无线蓝牙耳机怎么选?值得入手的蓝牙耳机推荐
  13. GlobalSign 域名型 SSL 证书
  14. 二代身份证读卡插件安装包(完整亲测可用).zip
  15. 最详细的maven教程
  16. 总体样本与样本均值X拔的一个重要公式推导
  17. 卡片的sak为不支持的类型_Python 植物大战僵尸代码实现(2):植物卡片选择和种植...
  18. Incorrect column count: expected 1, actual 5
  19. NOIP2017尼禄祭
  20. 项目集成Flowable工作流

热门文章

  1. 关于jquery.flexslider-min.js插件
  2. HTTP的请求头信息
  3. 租车自驾app开发有什么作用?租车便利出行APP开发
  4. 机器学习算法——详细介绍 集成学习,以及什么是Bagging、随机森林、Boosting、XGBoost
  5. android毕设论文谢辞,毕业论文谢辞范文
  6. mysql商品规格设计_[电商]我的商品规格设计思路
  7. jQuery动态完成CURD操作
  8. 数值分析matlab西南交通大学三次样条,数值分析绪论 教学课件 ppt-西南交通大学.ppt...
  9. 常用点击复制唤醒微信app、跳转微信界面
  10. 明辰智航云安—应用程序性能监控