【STL】iterator adapters_反向迭代器的实现

news2024/11/18 19:36:15

 放在专栏【C++知识总结】,会持续更新,期待支持

 本章相关文章:

【STL】容器适配器

【STL】list的模拟实现

【STL】vector的模拟实现


1、反向迭代器介绍

1.1、前言

在前文中我们已经讲过STL中的适配器概念,即在底层将一个类的接口转化为另一个类的接口,并根据此设计模式模拟实现了stack与queue。本篇文章将讲解的是适配器的另一种模式——迭代器适配器(iterator adapters)之反向迭代器。

1.2、反向迭代器

我们都知道迭代器作为STL六大组件之一,主要目的是为了可以像原生指针一样,实现对容器成员的遍历和访问。但是我们在此之前所讲的以及实现的都是从前往后的正向迭代器。而反向迭代器则与正向迭代器的遍历方向相反,从后往前反向遍历。既然作为一种适配器模式,反向迭代器的实现肯定离不开正向迭代器,事实上也确实如此,反向迭代器的操作实际上底层都调用的是正向迭代器与之对应的接口。

2、模拟实现

这里由于库中实现的较为复杂,涉及到的一些操作实现(萃取等)起来较为难以理解,在这里我们只是简单的对其实现即可。同时在我们对其实现完成后,我们可以将其用在不同的支持反向遍历的容器中使用。

2.1、反向迭代器的基本结构

既然作为一种适配器模式,反向迭代器的实现肯定离不开正向迭代器,所以该类的成员变量中需要存在一个正向迭代器,同时我们在实现时采用与正向迭代器相同的处理方式即:采用多参数模板完成const与非const版本共用同一份代码。如下为其基本结构:

2.1.1、构造函数

构造函数的实现很简单,直接根据传入的参数进行构造即可:

 2.1.2、++与--

反向迭代器的遍历与正向迭代器完全相反,正向迭代器的++操作,是从前往后的,因此对于反向迭代器来说就相当于自己的--操作(反向迭代器的方向是从后往前)。而正向迭代器的--操作,是从后往前的,因此对于反向迭代器来说就相当于自己的++操作。如下所示:

2.1.3、* 运算符重载

在实现对*的重载之前,我们首先要了解一下反向迭代器的结构,在STL中,反向迭代器是与正向迭代器一一对应,如下所示:

 但是呢,这里就出现了一个问题,因为在SGI版本的STL中,迭代器区间有一个习惯,即:前闭后开。但是这里对于反向迭代器来说,rbegin指向的是最后一个有效元素的下一个,而rend指向的是第一个有效元素。就成了前开后闭。因此,为了实现符合前闭后开的习惯,这里对反向迭代器指针实际指向的内容做了修改,使每一个位置的指向都往“前”移动一个单位(对于反向迭代器来说就是往后),这样就符合了“前闭后开”的要求。

 反向迭代器的往后,实际就是正向的往前,因此这里如下实现:

 2.1.4、-> 运算符重载

这里也是与*相同,也要满足前闭后开的要求,而我们上方对*的重载已经实现了返回前一个指向的内容,这里我们只需要对其复用,取其返回值的地址即可:

2.1.5、==与!=

依然底层调用正向迭代器对应的==与!=的重载:

至此我们的简易版本的反向迭代器就实现完毕了,我们发现,我们底层的所有接口其实都是调用了正向迭代器的对应接口,而这就是适配器模式的主要体现:将一个类的接口转化成另一个类相关对应的接口来满足所实现的需求。

3、反向迭代器的应用

3.1、应用于list

这里我们可以对其进行使用,我们可以放在我们前文所实现的list中使用:在使用时需包含我们这里写的反向迭代器的头文件,同时在list中实现rbegin与rend,我们在上文已经讲过了,rbegin与end对应,rend与begin对应:

 接下来我们对其进行测试:

3.2、应用于vector

当然,我们也可以将我们写的反向迭代器放到vector中去用,用法相同:

 同样,我们进行测试:

 至此我们之前所写的list与vector都支持了反向迭代器版本。

源码全部放在个人gitee,<<点击跳转>>


end.

生活原本沉闷,但跑起来就会有风!🌹

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

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

相关文章

centos7卸载自带jdk(openjdk)

前提&#xff1a;root模式 1、查看自带jdk 首先确定我们有自带的jdk&#xff0c;然后搜索jdk java -version rpm -qa | grep jdk 2、使用如下命令卸载openjdk rpm -e --nodeps [name] 复制带有openjdk的那两行&#xff0c;有的人可能有多行。一条条执行。 最后java -ver…

win10/11环境解决fastboot模式看不到设备

问题描述&#xff1a; C:\Users\good>adb devices * daemon not running. starting it now on port 5037 * * daemon started successfully * List of devices attached ? device C:\Users\good>fastboot devices fastboot devices 不是内部或外部命令&#xff0…

茶油生产加工MES质量溯源平台源码(spring boot+mybatis+easyui+mysql+h5)

一、生产加工MES&#xff08;Manufacturing Execution System&#xff0c;简称MES&#xff09;是一种面向车间的生产过程管理与实时信息系统。它主要负责监控生产过程&#xff0c;管理生产资源&#xff0c;优化生产流程&#xff0c;提高生产效率和质量。MES系统需要与ERP系统、…

【阻塞队列】阻塞队列DelayedWorkQueue源码详解

目录 一、前言 二、ScheduledThreadPoolExecutor线程池 三、DelayedWorkQueue延迟阻塞队列 四、工作原理 五、源码分析 5.1 定义 5.2 成员属性 5.3 构造函数 5.4 入队方法 5.4.1 offer添加元素 5.4.2 扩容grow() 5.4.3 向上堆化siftUp 5.5 出队方法 5.5.1 take()…

LangChain 基于 ChatGPT 构建本地知识库问答应用

一、使用本地知识库构建问答应用 上篇文章基于 LangChain 的Prompts 提示管理构建特定领域模型&#xff0c;如果看过应该可以感觉出来 ChatGPT 还是非常强大的&#xff0c;但是对于一些特有领域的内容让 GPT 回答的话还是有些吃力的&#xff0c;比如让 ChatGPT 介绍下什么是 L…

二重积分的解题技巧

计算方法 本节内容一般都应该先画图再思考后续内容较为直观 基本口诀是&#xff1a;后积先定限&#xff0c;限内画条线&#xff0c;先交写下限&#xff0c;后交写上限&#xff08;且下限必须小于上限&#xff09; 结合下图进行解释&#xff0c;后积先定限&#xff0c;对于X-型来…

Java基础-多线程JUC-多线程实现的三种形式

1. 第一种 继承Thread&#xff0c;重写run方法 public class demo1 {public static void main(String[] args) {/*** 多线程的第一种启动方式* 1. 定义一个类继承Thread* 2. 重写run方法* 3. 创建子类的对象&#xff0c;并启动线程*/MyThread myThread new MyThread();MyThrea…

受检异常和非受检异常

所谓的受检异常&#xff0c;表示在编译的时候强制检查的异常&#xff0c;这种异常需要显示的通过 try/catch 来捕捉&#xff0c;或者通过 throws 抛出去&#xff0c;否则从程序无法通过编译。 而非受检异常&#xff0c;表示在编译器可以不需要强制检查的异常&#xff0c;这种异…

Java基础---如何理解Java中的多态

目录 所谓多态 方法的重载与重写 重载和重写的区别 所谓多态 多态的概念比较简单&#xff0c;就是同一操作作用于不同的对象&#xff0c;可以有不同的解释&#xff0c;产生不同的执行结果如果按照这个概念来定义的话&#xff0c;那么多态应该是一种运行期的状态为了实现运行…

VScode 配置Orbslam debug调试环境(ubuntu18.04)

如果没有安装VScode的话&#xff0c;可以去点击官网下载 如果已经安装了VScode&#xff0c;可以直接把ORBSLAM的工程文件夹拖到VScode中&#xff0c;系统会提示是否添加C/C编译工具&#xff0c;直接安装即可&#xff0c;安装过程中也可以安装一下cmake 将ORBSLAM的工程文件夹拖…

obs编译

源码地址&#xff1a; GitHub - obsproject/obs-studio: OBS Studio - Free and open source software for live streaming and screen recording windows 编译&#xff1a; Build Instructions For Windows obsproject/obs-studio Wiki GitHub https://www.cnblogs.co…

app自动化测试(Android)--App 控件定位

客户端的页面通过 XML 来实现 UI 的布局&#xff0c;页面的 UI 布局作为一个树形结构&#xff0c;而树叶被定义为节点。这里的节点也就对应了要定位的元素&#xff0c;节点的上级节点&#xff0c;定义了元素的布局结构。在 XML 布局中可以使用 XPath 进行节点的定位。 App的布…

pytorch 迁移训练自己的数据集

1、pytorch 基础训练 上一节为基础 视频与AI&#xff0c;与进程交互(二) pytorch 极简训练自己的数据集并识别 接着上面一节&#xff0c;我们开始使用迁移学习&#xff0c;训练自己的数据集和保存网络&#xff0c;加载网络并识别。 2、 pytorch加载resnet18 RetNet网络的基础…

Vscode platformio Arduino开发STM32,点灯+串口调试

1.工具 USB-TTL(非常便宜&#xff0c;几块钱)STM32F103C8T6(几块钱) 2.引脚连线 USB-TTLSTM32TXPA10RXPA9VCC3.3VGNDGND 注意事项&#xff1a; 跳线帽位置&#xff1a;BOOT0接高电平(1)&#xff0c;BOOT1接低电平(0)每次上传程序前需要按一下复位键(之后&#xff0c;跳线帽…

互联网编程之基于 TCP 的单线程文件收发程序(CS架构)

目录 需求 服务端实现 客户端实现 测试 需求 可试着根据java编程课所学到的java socket编程技术&#xff0c;尝试编写一个基于 TCP 的单线程文件收发程序&#xff0c;需满足&#xff1a; 服务端程序预先定义好需要发送的文件并等待客户端的连接。 客户端连接成功后&…

ranger配置hive出錯:Unable to connect repository with given config for hive

ranger配置hive出錯&#xff1a;Unable to connect repository with given config for hive 我一開始我以為是我重啟了ranger-admin導致ranger有點問題&#xff0c;後面排查之後發現是我之前把hiveserver2關閉了&#xff0c;所以只需要重新開啟hiveserver2即可

开源 sysgrok — 用于分析、理解和优化系统的人工智能助手

作者&#xff1a;Sean Heelan 在这篇文章中&#xff0c;我将介绍 sysgrok&#xff0c;这是一个研究原型&#xff0c;我们正在研究大型语言模型 (LLM)&#xff08;例如 OpenAI 的 GPT 模型&#xff09;如何应用于性能优化、根本原因分析和系统工程领域的问题。 你可以在 GitHub …

一个真实的社会工程学攻击

社会工程学实例 不同于以往通过心理诱骗暗示或欺诈手段社会工程学举例&#xff0c;本次为大家介绍一种特殊的结合刑侦推理及利用技术手段实现的社会工程学实例&#xff0c;可以把它归类为特殊层面的信息收集手段——通过照片确定发拍照人所在的位置&#xff0c;这种社工手段严格…

ExtJS4 相关

2. 程序架构 2.1 目录结构 推荐下面这种目录结构(非强制&#xff0c;如果你足够懂和自信) - appname- app- namespace- Class1.js- Class2.js- ...- extjs- resources- css- images- ...- app.js- index.html appname 包含所有程序代码&#xff0c;是根目录 app 包含所有类&…

MySQL基础篇(day03,复习自用)

MySQL第三天 排序与分页内容练习 多表查询内容练习 排序与分页 内容 #第五章 排序与分页#1.排序 #如果没有使用排序操作&#xff0c;默认情况下查询返回的数据是按照添加数据的顺序显示的。 SELECT * FROM employees;#1.1基本使用 #使用 ORDER BY 对查询到的数据进行排序操作 …