C++ | 反向迭代器

目录

前言

一、基本框架

二、起始位置和结束位置

三、反向迭代器的自增与自减

四、反向迭代器的判断

五、list类的修改

 六、单独设计反向迭代器类的意义


前言

        反向迭代器实际上与我们前面的stack、queue、priority一样,都是适配器;我们可以通过正向迭代器构建出反向迭代器;

一、基本框架

        我们首先创建一个反向迭代器的头文件;我们将所有反向迭代器的代码放入这个文件中;

        前面我们也说过了,反向迭代器实际上是一种适配器,其实是对任意双向的正向迭代器的封装;因此有了以下代码;

namespace MySpace
{// Iterator为迭代器模板参数,Ref为数据的引用类型,Ptr为数据的指针类型template<class Iterator, class Ref, class Ptr>class __reverse_iterator{public:typedef __reverse_iterator<Iterator, Ref, Ptr> self;__reverse_iterator(Iterator it) : _it(it){}private:Iterator _it;};
}

二、起始位置和结束位置

        首先,我们要确定的是反向迭代器起始位置与结束位置,在list中,我们一般会想着将起始位置定位最后一个数据的位置,而结束位置为哨兵位头节点的位置;而在STL库中,为了追求对称之美,起始位置和结束位置如下图所示;

        这样定义的话,对于解引用,又出了一些问题,我们必须要对其--,也就是访问前一个位置的数据;因此,对于*的重载与->的重载,有了如下代码;

Ref operator*() const{// 找到前一个位置的数据Iterator tmp(_it);--tmp;// 这里的*是在传入参数的那个迭代器实现的重载(即正向迭代器的*)return *tmp;}Ptr operator->() const{Iterator tmp(_it);--tmp;// 这里的->是在传入参数的那个迭代器实现的重载(即正向迭代器的->)return tmp->_data;}

三、反向迭代器的自增与自减

        反向迭代器的自增与自减我们可以分别调用正向迭代器的自减与自增来实现;即他加我减,他减我加;

		self& operator++(){--_it;return *this;}self operator++(int){self tmp(_it);--_it;return tmp;}self& operator--(){++_it;return *this;}self operator--(int){self tmp(_it);++_it;return tmp;}

四、反向迭代器的判断

        对于反向迭代器的判断,我们只需重载==与!=即可;我们也可以调用正向迭代器的==与!=来实现;

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

五、list类的修改

        前面我们将反向迭代器的类实现了,这里我们还需要在list类中重定义反向迭代器名(统一接口名),以及添加相关接口(如rbegin、rend等)

		// 反向迭代器typedef __reverse_iterator<iterator, T&, T*> reverse_iterator;typedef __reverse_iterator<const_iterator, const T&, const T*> const_reverse_iterator;// 反向迭代器相关成员函数reverse_iterator rbegin(){return reverse_iterator(end());}const_reverse_iterator rbegin() const{return const_reverse_iterator(end());}reverse_iterator rend(){return reverse_iterator(begin());}const_reverse_iterator rend() const{return const_reverse_iterator(begin());}

        添加了如上代码后,我们的反向迭代器便可以运行了;

 六、单独设计反向迭代器类的意义

        可以看到,我们单独将反向迭代器放入一个单独的文件,也设计了一个单独的类,这有什么意义呢? 实际上,我们刚才设计的反向迭代器的接口也可以适用于vector等容器,我们仅仅只需要实现vector正向迭代器,我们便可通过这个反向迭代器对正向迭代器进行封装即可,仅仅在类中添加一些接口就可以适配上,因此我们实现的反向迭代器是一种适配器;关于list与vector的反向迭代器的源码,我放在了下面供大家参考;

vector反向迭代器

list反向迭代器

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/20981.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

信道编码---RS编码与译码原理

本文介绍了RS编码以及译码的原理。 本文的内容基本上都来自刘梦欣的《基于FPGA的RS编译码研究与设计》&#xff0c;大家可以通过知网找到这篇文章&#xff0c;链接在下面。对RS码的原理讲解非常清楚&#xff0c;如果要看的话可以结合第2和第3部分一起看更好懂。我的整理也是比较…

【采用有限元法技术计算固有频率和欧拉屈曲荷载】使用有限元法的柱子的固有频率和屈曲荷载(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Java----使用eureka进行注册连接(微服务简单实现)

当采用微服务架构时&#xff0c;各个业务流程被逐一分解&#xff0c;虽说是分解&#xff0c;但还是要进行连接的&#xff0c;最简单的就是使用http请求&#xff0c;将他们联系起来&#xff0c;通过给容器注入restTemplate&#xff0c;然后使用内置的方法进行请求&#xff0c;但…

抖音seo源码-源代码开发搭建-开源部署操作日志

一、开发者前言大环境概述 抖音seo源码开发是一项非常重要的技术&#xff0c;在抖音上&#xff0c;有很多视频&#xff0c;如果你想让自己的视频脱颖而出&#xff0c;那么就需要优化自己的seo源码。不过&#xff0c;为了保护用户的隐私&#xff0c;抖音并不公开其seo算法的细节…

Git的使用

初始化仓库 git init 查看仓库状态 git status 仓库的四种状态&#xff1a; Untracked&#xff08;未跟踪&#xff09;: 文件未被Git追踪&#xff0c;即Git对文件的版本控制尚未开始。这意味着文件还没有被添加到Git仓库中。Unmodified&#xff08;未修改&#xff09;: 文…

opencv图片根据规则改变颜色

解析 1. 读入图片 2.通道分离 3.像素值在【100&#xff0c;200】之间&#xff0c;赋值128。大于200赋值255&#xff0c;小于100赋值0。 源码 import cv2 img_raw_path"past/unet-test_result0-0-1-0.png" img_rawcv2.imread(img_raw_path) (r,g,b)cv2.split(img_…

【网络编程】Linux服务器程序规范相关内容

文章目录 1、日志1.1、syslog()函数 2、用户信息2.1、UID、EUID、GID、EGID 3、进程间关系3.1、进程组3.2、会话 4、服务器程序后台化&#xff08;守护进程&#xff09; 1、日志 Linux提供一个守护进程rsyslogd来处理系统日志&#xff0c;系统日志中包括用户进程产生的日志以及…

less预处理语言的运用之-变量拼接那点事

less语法的技巧总结&#xff0c;很基础&#xff0c;熟练掌握后能提高我们在大型项目中的开发效率 a:0.5; showdaw-px:100; mkcolor1:#6ec5ff; num:1; .outer{//拼接的字符串在变量后面&#xff0c;需要在冒号后面加~width:~"{showdaw-px}px";//拼接的字符串在冒号后…

Intellij IDEA突然无法启动问题

遇到的情况&#xff1a;Intellij IDEA 双击或者鼠标右键右键单击都无法启动&#xff0c;打开任务管理器也没有Intellij IDEA线程启动。 解决方法&#xff1a; 第一步&#xff1a;以管理员身份打开命令提示符&#xff0c;输入命令(“ netsh winsock reset ”)&#xff0c;关闭…

selenium查找svg元素

目录 如何为SVG元素编写XPath 使用local-name&#xff08;&#xff09;的语法 需要记住的一点 将“and”与SVG元素一起使用 如何定位嵌套的SVG元素&#xff1f; XPath是一种用于定位XML文档中的web元素的语言&#xff0c;包括构成网页的HTML文档。在Selenium中&#xff0…

用VScode运行vue框架时,报无法运行的错误

报错内容 问题出在了版本上面&#xff0c;从reason可以了解到是由于不支持的原因 然后上面报错的几乎都属于node_modules包内的&#xff0c;因此我们可以判断&#xff0c;是node.js版本的问题导致的&#xff08;尤其是你从网上拷贝比较旧的项目的时候&#xff0c;可能需要对依赖…

在VMware Workstation安装 ESXI8.0初体验

文章目录 &#x1f41f;前言&#x1f41f;安装&#x1f41f;在VMware WorkStation中创建虚拟机&#x1f41f;ESXI部署安装&#x1f41f;安装完成后配置 &#x1f41f;前言 ESXI8.0版本开始最低RAM从以前的4GB变为8GB 本文所使用到的镜像以及Key都可以到我的网站中下载 地址&…