C++:反向迭代器reverse_iterator

反向迭代器是C++ STL(标准模板库)中的一种迭代器类型,它允许我们逆向遍历容器(如std::vector, std::list, std::deque等)中的元素。反向迭代器指向容器的“尾部”元素,并通过递减操作向前移动(即向容器的开始方向移动)。

通过前面list的模拟实现知道,反向迭代器的++就是正向迭代器的--,反向迭代器的--就是正向迭代器的++,因此反向迭代器的实现可以借助正向迭代器,即:反向迭代器内部可以包含一个正向迭代器,对正向迭代器的接口进行包装即可。

一、反向迭代器的类模板参数

template<class Iterator>
//Iterator为正向迭代器,反向迭代器复用正向迭代器的相反操作实现

反向迭代器的模板参数class Ref与class Ptr可以省略,因为Iterator内部同样有模板参数class Ref与class Ptr。

typedef typename Iterator::Ref Ref;//与正向迭代器相同,operator*()的返回值类型
typedef typename Iterator::Ptr Ptr;//operator->()的返回值类型

注意:此处typename的作用是明确告诉编译器,Ref是Iterator类中的类型,而不是静态成员变量。

二、反向迭代器的封装

封装实现反向迭代器, 要先定义一个Iterator cur成员变量以复用Iterator的运算符操作

构造函数:

template<class Iterator, class Ref, class Ptr>
struct ReverseIterator 
{typedef ReverseIterator<Iterator, Ref, Ptr> Self;Iterator cur;ReverseIterator(Iterator it):cur(it){}
};

 operator*()与operator->():
反向迭代器是正向迭代器的逆置,其rbegin()为第一个元素为Iterator的最后一个元素的下一个,因此反向迭代器的operator*()需要访问元素先进行--操作。

Ref operator*() {Iterator tmp = cur;//访问元素由tmp进行--操作--tmp;return *tmp;
}//operator->()复用operator*(),&operator*()为节点数据的地址
Ptr operator->() {return (&operator*());
}

前置++、--和后置++、--: 

反向迭代器的++就是正向迭代器的--,反向迭代器的--就是正向迭代器的++。

Self& operator++() {--cur;return *this;
}Self operator++(int) {Iterator tmp(cur);--cur;return tmp;
}Self& operator--() {++cur;return *this;
}Self operator--(int) {Iterator tmp(cur);++cur;return tmp;
}

反向迭代器的比较与正向迭代器一致:

bool operator!=(const Self& s) {return cur != s.cur;
}bool operator==(const Self& s) {return cur == s.cur;
}

 三、rbegin()与rend()

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

完整实现如下 :

template<class Iterator, class Ref, class Ptr>
struct ReverseIterator {typedef ReverseIterator<Iterator, Ref, Ptr> Self;Iterator cur;ReverseIterator(Iterator it):cur(it){}Self& operator++() {--cur;return *this;}Self operator++(int) {Iterator tmp(cur);--cur;return tmp;}Self& operator--() {++cur;return *this;}Self operator--(int) {Iterator tmp(cur);++cur;return tmp;}Ref operator*() {Iterator tmp = cur;--tmp;return *tmp;}Ptr operator->() {return (&operator*());}bool operator!=(const Self& s) {return cur != s.cur;}bool operator==(const Self& s) {return cur == s.cur;}
};

 

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

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

相关文章

Vscode 总是发现不到包package

Vscode 右下角&#xff0c;选择3.8.6就不再报错&#xff0c;其他最新版本的3.11.7就不行。

【设计模式】创建者模式之 工厂方法 抽象工厂

工厂方法模式(Factory Method) 一个特定功能&#xff0c;往往有多种实现方式&#xff0c;但是很难有某一个实现可以适用于所有情况&#xff0c;因此往往需要根据特定的场景选择不同的实现。试想&#xff1a;把选择具体实现的代码放在业务中会发生什么&#xff1f;每当我们需要…

C++中lambda表达式的使用及注意事项

在C中一共有四种可调用对象&#xff0c;分别是函数&#xff0c;函数指针&#xff0c;仿函数&#xff0c;和lambda表达式&#xff0c;本文将从lambda表达式的定义形式开始&#xff0c;到lambda表达式的使用场景&#xff0c;向你讲述lambda的使用及注意事项。 lambda表达式的定义…

Java中的ThreadLocal为什么使用弱引用

ThreadLocal中为什么使用弱引用 补个概念&#xff1a; ThreadLocalMap中的key就是Entry&#xff0c;Entry是一个弱引用&#xff0c;关联了当前ThreadLocal对象。需要存储的数据为值。调用set方法要传入两个参数ThreadLocal对象和要存入ThreadLocal对象的数据。 如下图&#xf…

详细分析Java中的@AllArgsConstructor注解

目录 前言1. 基本知识2. 实战 前言 事情起因是Spring的循环依赖 详情可见&#xff1a;出现The dependencies of some of the beans in the application context form a cycle 解决方法&#xff08;全&#xff09; 1. 基本知识 AllArgsConstructor 是 Lombok 提供的一个注解…

《第一行代码》第二版学习笔记(9)——服务

文章目录 一、线程二、解决异步消息处理机制1、消息组成2、AsyncTask 三、Service1、启动和停止服务2、活动和服务通信3、服务的生命周期4、创建前台服务5、使用IntentService 四、服务的最佳实践 一、线程 android不允许在子线程中更新IU操作 二、解决异步消息处理机制 1、…

【linux软件基础知识】- struct gendisk

在Linux内核中&#xff0c;struct gendisk代表通用块设备。 它是用于管理和表示块设备的基本数据结构&#xff0c;例如硬盘驱动器、固态驱动器和其他存储设备。 struct gendisk 包含各种字段和指针&#xff0c;提供与块设备相关的信息和操作。 struct gendisk 结构的一些重要字…

LeetCode题练习与总结:扰乱字符串--87

一、题目描述 使用下面描述的算法可以扰乱字符串 s 得到字符串 t &#xff1a; 1. 如果字符串的长度为 1 &#xff0c;算法停止 2. 如果字符串的长度 > 1 &#xff0c;执行下述步骤&#xff1a; 在一个随机下标处将字符串分割成两个非空的子字符串。即&#xff0c;如果已…

41.乐理基础-拍号-小节、小节线、终止线

小节线&#xff1a;下图红框中的竖线就是小节线 小节、终止线&#xff1a;最后的终止线就是文字意思表示乐谱结束了&#xff0c;后面没有了 下图中 0.5表示0.5拍&#xff08;八分音符&#xff09;、1表示1拍&#xff08;四分音符&#xff09;、0.25表示0.25拍&#xff08;十六分…

二、Redis五种常用数据类型-String

1、用途 简单的K-V缓存计数器分布式锁session共享分布式ID生成(自增) 2、底层实现结构 Redis底层是c语言实现的&#xff0c;但是并没有使用c的string来表示字符串&#xff0c;而是使用自己的简单动态字符串的抽象类型(simple dynamic string,SDS)。 SDS结构&#xff1a; st…

为什么centos官方版不支持arm架构?

为什么centos官方版不支持arm架构&#xff1f; 1、资源限制&#xff1a;CentOS是由社区维护的开源操作系统&#xff0c;其开发和维护需要大量的人力和物力资源。由于ARM架构的设备相对较少&#xff0c;社区资源有限&#xff0c;因此官方版CentOS选择集中精力在x86架构上进行开发…

编程基础学什么课程内容

编程基础学习的课程内容有&#xff1a;程序设计基础、算法与数据结构、计算机科学原理、面向对象编程、网页开发基础等课程内容&#xff0c;以下是上大学网 (www.sdaxue.com)整理的具体课程或技能领域内容&#xff0c;供大家参考&#xff01; 程序设计基础&#xff08;或计算机…

每日OJ题_DFS解决FloodFill⑦_力扣LCR 130. 衣橱整理(原剑指Offer13机器人的运动范围)

目录 力扣LCR 130. 衣橱整理&#xff08;原剑指Offer13机器人的运动范围&#xff09; 解析代码 力扣LCR 130. 衣橱整理&#xff08;原剑指Offer13机器人的运动范围&#xff09; LCR 130. 衣橱整理 难度 中等 家居整理师将待整理衣橱划分为 m x n 的二维矩阵 grid&#xff…

【精品毕设推荐】基于Javaee的影视创作论坛的设计与实现

点击下载原文及代码 摘 要 随着时代的发展&#xff0c;互联网的出现&#xff0c;给传统影视行业带来的最大便利就是&#xff0c;方便了影视从业人员以及爱好者的交流和互动&#xff0c;而为用户提供一个书写影评&#xff0c;阅读影评以及回复影评的平台&#xff0c;以影评为…

Spring MVC、Spring Boot和Spring Cloud 三者区别和联系

引言 近期在做系统重构的项目工作&#xff0c;在跟开发沟通对接过程中&#xff0c;经常听到他们讲开发框架&#xff1a;Spring MVC、Spring Boot、Spring Cloud&#xff0c;故对这三者进行一些学习了解&#xff0c;下面我针对由来、作用与关联等方面&#xff0c;来总结一下我学…

《第一行代码》第二版学习笔记(8)——网络技术

文章目录 一、Http1、HttpURLConnection2、OKHttp 二、解析JSON格式数据1、使用JSONObject2、使用GSON解析JSON数据 一、Http 1、HttpURLConnection public void run() {HttpURLConnection connection null;BufferedReader reader null;try {URL url new URL("http://…

力扣每日一题114:二叉树展开为链表

题目 中等 提示 给你二叉树的根结点 root &#xff0c;请你将它展开为一个单链表&#xff1a; 展开后的单链表应该同样使用 TreeNode &#xff0c;其中 right 子指针指向链表中下一个结点&#xff0c;而左子指针始终为 null 。展开后的单链表应该与二叉树 先序遍历 顺序相同…

js方法返回类型

在JavaScript中&#xff0c;方法可以是以下几种形式&#xff1a; 1. **函数声明**&#xff1a;传统的函数声明方式。 javascript function greet() { console.log(Hello, World!); } 2. **函数表达式**&#xff1a;使用变量赋值的方式定义函数。 javascript const greet…

2024年CMS市场的份额趋势和使用统计

目前市面上有超过一半的网站都是使用CMS来搭建的&#xff0c;据不完全统计&#xff0c;现在大概有900多种CDM可供选择&#xff0c;以下是最常见的CMS的市场份额和使用率信息&#xff1a; 除了WordPress以外&#xff0c;Shopify和Wix也是比较流行的内容管理系统&#xff0c;尤其…