+前言

STL中不少的容器需要有迭代器这样的设计,特别是正向迭代器,几乎每个容器都有自己的特定实现方式,有了正向迭代器之后,我们还要提供反向迭代器以供一些特殊的需求,但是许多容器的正向迭代器实现的方式不一样,如果我们要实现其反向迭代器,每个容器的反向迭代器的实现方式也不一样,有没有一种方法能够统一反向迭代器的实现方式呢?

有的,那就是拿已有的正向迭代器进行封装,这样只要我们实现了正向迭代器,反向迭代器自然而然就形成了,本篇文章我们就来一起探究这种设计方式。

反向迭代器的设计

  • 一、反向迭代器的结构
  • 二、反向迭代器的接口实现
    • 1、*运算符重载
    • 2、算术运算符 ++ - -的重载
    • 3、->操作符重载
    • 3、关系运算符
  • 三、关于反向迭代器的一些讨论

一、反向迭代器的结构

我们设计的反向迭代器是用正向迭代器实现的,这样反向迭代器的实现方式就统一了,那么我们反向迭代器的成员变量就是一个正向迭代器,关于成员函数,我们反向迭代器提供的接口与正向迭代器提供的接口一样。

//第一个模板参数传递 正向迭代器,第二个传递 迭代器的引用 第三个传递 迭代器的地址template<class Iterator, class Ref, class Ptr>//用struct定义类,因为我们想要公开我们的接口struct _reverse_iterator{//对自己进行typedef方便使用typedef _reverse_iterator<Iterator, Ref, Ptr> self;//成员变量 是一个正向迭代器Iterator _current;//构造函数   用一个正向迭代器进行初始化反向迭代器对象_reverse_iterator(Iterator it):_current(it){}//*运算符重载Ref operator*();//前置++运算符重载self& operator++();//后置++运算符重载self operator++(int)//前置--运算符重载self& operator--()//后置--运算符self operator--(int)//->操作符Ptr operator->()//关系运算符bool operator!=(const self& s);bool operator==(const self& s);}

容器类内的rbeginrend 函数

//类内使用反向迭代器
class myclass
{//此类内要配套有一个正向迭代器iterator,然后传给外面的反向迭代器//将反向迭代器进行typedef方便使用typedef _reverse_iterator<iterator, T&, T*> reverse_iterator;//反向迭代器typedef _reverse_iterator<iterator, const T&, const T*> const_reverse_iterator;//反向迭代器reverse_iterator rbegin(){return reverse_iterator(end());}reverse_iterator rend(){return reverse_iterator(begin());}//const反向迭代器const_reverse_iterator rbegin() const{return const_reverse_iterator(end());}const_reverse_iterator rend() const{return const_reverse_iterator(begin());}
};

注意: 反向迭代器这里我们采用了对称结构便于理解对比,但这也导致我们后面在进行*解引用操作符时要解引用前一个位置!

二、反向迭代器的接口实现

1、*运算符重载

我们可以创建一个局部对象,对局部对象进行--找到前一个位置,然后再进行解引用返回就行了。

//*运算符重载
Ref operator*()
{//这里是不用写拷贝构造的,默认的拷贝构造会对内置类型进行值拷贝,对自定义类型调用它的拷贝构造Iterator tmp = _current;--tmp;return *tmp;
}

2、算术运算符 ++ - -的重载

由于我们的反向迭代器是由正向迭代器实现的,反向迭代器++就相当于正向迭代器- - ,明白了这个就很好实现算术运算符重载了。

//前置++运算符重载
self& operator++()
{--_current;return(*this);
}
//后置++运算符重载
self operator++(int)
{//保存当前对象self tmp(*this);--_current;//返回--之前的对象return tmp;
}
//前置--运算符重载
self& operator--()
{++_current;return (*this);
}
//后置--运算符
self operator--(int)
{self tmp(*this);++_current;return tmp;
}

3、->操作符重载

->运算符重载我们只需要返回容器中存储的自定义类型的对象的地址就行了,我们可以先调用operator*()拿到容器中存储的对象,然后再进行取地址&

Ptr operator->()
{return &(operator*());
}

3、关系运算符

要判断两个反向迭代器相不相等,只需要判断反向迭代器里面的成员变量相不相等就行了。

//关系运算符
bool operator!=(const self& s)
{return _current != s._current;
}
bool operator==(const self& s)
{return _current == s._current;
}

到这里我们的反向迭代器就已经形成了。

三、关于反向迭代器的一些讨论

由于我们的反向迭代器是用模板写的,当我们将vector的迭代器类型传递过去时,我们的反向迭代器就变成了vector的反向迭代器,当我们将list的迭代器传递过去时,就形成了list的反向迭代器。

传递的迭代器必须的二元迭代器,可以++ ,- -。forward_list的迭代器就不行!

例如:实现vector的反向迭代器,我们只需要在类内部传递一下正向迭代器,然后typedef一下就行了。

template<class T>
class vector
{public://正向迭代器typedef  T* iterator;//反向迭代器   将正向迭代器进行传递给反向迭代器typedef _reverse_iterator<iterator, T&, T*> reverse_iterator;typedef _reverse_iterator<iterator, const T&, const T*> const_reverse_iterator;//普通迭代器  ------------------------------------------------iterator begin();iterator end();//const迭代器typedef const T* const_iterator;const_iterator begin() const;const_iterator end() const;//反向迭代器reverse_iterator rbegin(){return reverse_iterator(end());}reverse_iterator rend(){return reverse_iterator(begin());}//const反向迭代器const_reverse_iterator rbegin() const{return const_reverse_iterator(end());}const_reverse_iterator rend() const{return const_reverse_iterator(begin());}...... ...... ......
};

【C++】反向迭代器的设计相关推荐

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

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

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

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

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

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

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

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

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

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

  6. 反向迭代器(rbegin,rend)

    C++ primer (中文版第四版)第273页 9.3.2 begin和end成员 begin和end操作产生指向容器内第一个元素和最后一个元素的下一个位置的迭代器,如下所示.这两个迭代器通常用于标 ...

  7. STL-reverse_iterator 反向迭代器

    回顾 对于STL中的容器,迭代器(iterator)是很重要的部分,同时迭代器也是STL六大组件之一,在之前我们实现vector和list中,我们已经对于迭代器有了初步的认识,为什么设计迭代器? 就是 ...

  8. [C++]反向迭代器

    目录 前言: 1 对反向迭代器的构造思想 2 实现反向迭代器 3 完整代码 前言: 本篇文章主要介绍了STL容器当中的反向迭代器,可能有朋友会说:"反向迭代器有什么好学的?不一样还是迭代器吗 ...

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

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

最新文章

  1. Spyder导入已有文件夹
  2. html编写个人博客_第 06 篇:博客从“裸奔”到“有皮肤”
  3. Vim快捷输出查找寄存器的内容(去除\,\和\V)
  4. 机器学习中距离和相似性度量方法
  5. JVM_03 运行时数据区[ 堆 ]
  6. SpringBoot系列:Spring Boot集成定时任务Quartz
  7. .NET(C#) Internals: .NET Framework中已使用的设计模式
  8. maf中anglearc_Oracle MAF中的LOV
  9. Java - 泛型 ( Generic )
  10. 计算机电子表格公式应用和操作,计算机电子表格公式应用常见错误及处理
  11. 解压速度更快, Zstandard 1.4.1 发布
  12. 05-基础widgets
  13. 异常排查_Python-日志模块.NoSectionError: No section: '*' 错误?
  14. jwt如何加盐_手把手教你使用JWT实现单点登录
  15. Java程序员博客系统推荐!我调研了100来个 Java 开源博客系统,发现这 5 个最好用!
  16. iShare.js分享插件
  17. Python 猴子补丁
  18. 使用ceres库将经纬度坐标GCJ02到WGS84精确转换
  19. 魔兽十区服务器人最多,十区毁灭计划 新一轮wow大服务器实装公告
  20. vue鼠标划过移入移出触发方法

热门文章

  1. 英语语速测试软件,中英文朗读专家设置语速的操作流程
  2. anychat java开发文档_AnyChat视频云平台开发指南
  3. 海思麒麟芯片详细参数全集
  4. redis简介-各种基础
  5. 电力系统继电保护基础知识
  6. Light absorption(光吸收)
  7. 2023 《计算机应用》 期刊最新投稿经验!!!
  8. 【数字基带信号】基于matlab实现单双极归零码和功率谱仿真
  9. 视频监控刀模切割件是否脱落
  10. 西门子精彩触摸屏SMART V3组态报警的具体方法示例