初识C++ · 反向迭代器简介

目录

前言

反向迭代器的实现


前言

继模拟实现了list和vector之后,我们对迭代器的印象也是加深了许多,但是我们实现的都是正向迭代器,还没有实现反向迭代器,那么为什么迟迟不实现呢?因为难吗?实际上还好。

我们实现const迭代器的时候,有两种路,一是直接来一个类,二是通过模板,非const迭代器的复用来实现的,同理,我们实现反向迭代器的话,也可以每种结构都来一个单独的反向迭代器的类,但是科学家们觉得太麻烦了,所以把反向迭代器的高度拉的很高,高到什么程度呢?高到一个反向迭代器可以适配所有的结构,本质上就是复用原来的正向迭代器,两种迭代器的区别只是遍历的方向不同而已,即++变成--,源码的实现方式比较复杂,我们实现方式是,传正向迭代器过来,复用对应正向迭代器的函数即可,这里就需要单独创建一个类模板了。


反向迭代器的实现

我们大思路是通过判断传的迭代器的不同,调用对应正向迭代器的函数,所以我们创建的反向迭代器的类的成员变量是iterator,实现的接口还是那么几个,!=  *   ->  ++ -- :

namespace Free
{template <class iterator,class Ref,class Ptr>struct ReverseIterator{typedef ReverseIterator<iterator,Ref, Ptr> self;ReverseIterator(iterator it):_it(it){}iterator _it;};
}

迭代器其实有个共同的特点就是一般使用struct,因为里面的变量函数什么的都是要访问的,使用class就麻烦了一点点。

第一个参数是迭代器,也就是判断复用谁的迭代器,第二个参数是引用,第三个参数是指针类型。

这里需要引入一个问题

这是我们没真正接触反向迭代器之前所猜想的反向迭代器结构。

但是源码的操作不是的,计算机科学家们可能有点强迫症?希望对称。

这是链表中的反向迭代器,顺序表同理,主打的就是一个对称。

那么这时候的访问就成了问题,此时源码的神之一手出现了,比如链表,rbegin第一次访问的结果应该是5,那么我们就来一个临时变量,++之后(实际上是--)访问到5即可,这里是不可以迭代器-1或者迭代器--的,因为迭代器本身我们不能破坏,但是临时变量却可以随意捣鼓。

template <class iterator,class Ref,class Ptr>
struct ReverseIterator
{typedef ReverseIterator<iterator,Ref, Ptr> self;ReverseIterator(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;}bool operator!=(const self& s){return _it != s._it;}iterator _it;
};

这样的一个反向迭代器就算是完成了。


list vector中反向迭代器的应用

注意,这里实现的反向迭代器是个简单版本,只适用于list和vector。

使用的话,加几个typedef 来几个reverse_iterator函数就没问题了,比如list:

template<class T>
class list
{
public:typedef ListNode<T> Node;typedef ListIterator<T,T&,T*> iterator;typedef ListIterator<T,const T&,const T*> const_iterator;typedef ReverseIterator<iterator,T&,T*> reverse_iterator;typedef ReverseIterator<const_iterator,const T&,const T*> const_reverse_iterator;reverse_iterator rbegin(){return reverse_iterator(end());}reverse_iterator rend(){return reverse_iterator(begin());}
}

依旧不要忘记反向迭代器的核心是复用正向迭代器的函数,第一个参数一定是迭代器。

vector:

class vector
{
public:typedef T* iterator;typedef const T* const_iterator;typedef ReverseIterator<iterator, T&, T*> reverse_iterator;typedef ReverseIterator<const_iterator, const T&, const T*> const_reverse_iterator;reverse_iterator rbegin(){return reverse_iterator(end());}reverse_iterator rend(){return reverse_iterator(begin());}
}

测试代码:

int main()
{Free::list<int> lt = { 1,2,3,4 };Free::list<int>::reverse_iterator rit = lt.rbegin();while (rit != lt.rend()){cout << *rit << " ";++rit;}cout << endl;Free::vector<int> v = { 1,2,3,4 };Free::vector<int>::reverse_iterator it = v.rbegin();while (it != v.rend()){cout << *it << " ";++it;}return 0;
}

注意前置++和后置++的使用。


感谢阅读!

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

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

相关文章

《精品生活》万方普刊投稿发表简介

《精品生活》杂志是由国家新闻出版总署批准&#xff0c;南方出版传媒股份有限公司主管&#xff0c;广东大沿海出版工贸有限公司主办&#xff0c;广东精品生活杂志社出版的综合性文化期刊。主要栏目&#xff1a;教学研究、艺术教育、文化广角、民族文化、理论前沿、综合论坛。 刊…

【2024】Kafka Streams纤细介绍与具体使用(1)

目录 介绍关键特性应用场景核心概念部署方式kafka streams的处理模式 具体使用1、准备工作2、添加依赖3、代码实现3、测试 介绍 Kafka Streams是构建在Apache Kafka之上的客户端库&#xff0c;用于构建高效、实时的流处理应用。它允许你以高吞吐量和低延迟的方式处理记录流&am…

Prompt 指南之零样本与少样本提示,超详细解析!

前言 我将在本文中为你带来另外 2 种提示技术&#xff0c;它们分别是&#xff1a; 零样本提示&#xff08;Zero-shot Prompting&#xff09;少样本提示&#xff08;Few-shot Prompting&#xff09; shot 即代表示例 这两种技术利用 LLM 的强大预训练知识&#xff0c;通过最小…

云端狂飙:Django项目部署与性能优化的极速之旅

Hello&#xff0c;我是阿佑&#xff0c;这次阿佑将手把手带你亲自踏上Django项目从单机到云端的全过程&#xff0c;以及如何通过Docker实现项目的无缝迁移和扩展。不仅详细介绍了Docker的基本概念和操作&#xff0c;还深入探讨Docker Compose、Swarm和Kubernetes等高级工具的使…

1Panel 搭建 halo博客

线上服务器一直闲置&#xff0c;刷到视频 1Panel 能更好管理服务器&#xff0c;还能快速搭建博客&#xff0c;便上手试试&#xff0c;的确很方便&#xff0c;顺手记录一下。 零、准备工作 一台服务器&#xff08;按需购买&#xff0c;此处准备的阿里云服务器一台&#xff0c;也…

postman教程-14-生成随机数

领取资料&#xff0c;咨询答疑&#xff0c;请➕wei: June__Go 上一小节我们学习了Postman关联接口的调用方法&#xff0c;本小节我们讲解一下Postman生成随机数的方法。 在接口测试中&#xff0c;经常需要向接口发送不同的输入数据&#xff0c;以确保接口的健壮性和可靠性。…

中国自动气象站:现代气象观测的中流砥柱

引言 气象观测是人类认识和预报天气的重要手段。在现代科技的推动下&#xff0c;自动气象站成为气象观测的重要工具&#xff0c;为天气预报、防灾减灾和气候研究提供了宝贵的数据支持。本文将介绍中国自动气象站的发展历程、技术特点及其在气象观测中的重要作用。 中国自动气象…

关于远程销售的电子课程开发

一家国际网络安全公司委托我们开发用于培训销售代表远程和电话销售的互动电子内容。我们在 Articulate Storyline 中创建了情节脚本和二维动画&#xff0c;以解释关键概念和销售技巧。互动元素使学习者可以按照自己的节奏进行学习&#xff0c;而我们的动画插图则使材料生动起来…

【成都信息工程大学】只考程序设计!成都信息工程大学计算机考研考情分析!

成都信息工程大学&#xff08;Chengdu University of Information Technology&#xff09;&#xff0c;简称“成信大”&#xff0c;由中国气象局和四川省人民政府共建&#xff0c;入选中国首批“卓越工程师教育培养计划”、“2011计划”、“中西部高校基础能力建设工程”、四川…

运维系列.Linux下的用户管理

运维系列 Linux下的用户管理 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28550263/ar…

LabVIEW FPGA开发NI sbRIO-9607高精度数字滤波器

使用NI sbRIO-9607硬件平台&#xff0c;通过LabVIEW FPGA模块实现一个高精度数字滤波器。该应用不需要额外的实时操作系统 (RT)&#xff0c;所有控制与数据处理均在sbRIO-9607的FPGA上完成&#xff0c;充分利用其并行处理能力&#xff0c;实现低延迟、高性能的数据滤波。这种滤…

最新 Navicat Data Modeler 4 | 产品介绍

在过去的几周里&#xff0c;我们已经介绍了 Navicat 版本 17&#xff0c;现在我们来把注意力转移到另外两个值得关注的产品上&#xff0c;即 Navicat Data Modeler 和 Navicat BI&#xff08;之前称为 Navicat Chart Creator&#xff09;。今天的博客将介绍 Navicat Data Model…

AI Agent:人类工作范式的颠覆者还是人机协作新范式?

编者按&#xff1a; 当前大热的大语言模型和检索增强生成模型&#xff0c;虽然在语言理解和内容生成方面取得了突破性的进展&#xff0c;但仍然存在诸多限制。它们缺乏根据目标导引行为、持续学习和与环境交互的能力&#xff0c;难以应对复杂多变的现实场景需求。 今天为大家带…

代理IP科普:IP黑名单与IP白名单的机制与作用

在IP代理使用中&#xff0c;我们经常听到黑名单与白名单两个名词&#xff0c;它们不仅提供了强大的防御机制&#xff0c;还可以灵活应对不同的安全威胁。本文将详细探讨IP黑名单和白名单在网络安全中的双重屏障作用。 一、IP黑名单和白名单定义 IP黑名单与IP白名单是网络安全中…

事务管理AOP

通过事务操作 删除部门的时候,同时删除员工,那么如果其中有异常,那么就进行事务回滚 使用注解Trance Transactional-propagation(传播行为)

基于协同过滤算法的东北特产销售系统的设计

基于协同过滤算法的东北特产销售系统的设计 管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;基础数据管理&#xff0c;公告管理&#xff0c;新闻信息管理&#xff0c;商品管理 农户账户功能包括&#xff1a;系统首页&#xf…

vue3学习(七)

前言 接上一篇学习笔记&#xff0c;今天主要是分享上次学习完了&#xff0c;还没来得及记录&#xff0c;趁今天晚上换换脑子的时间记录下。 今天主要是记录的vuex文件的拆分&#xff0c;因为毕竟如果只在一个index.js文件写&#xff0c;文件会随着业务的复杂性上升&…

从0-1实现大模型

目录 输入数据准备 滑动窗口造数据 Data sampling with a sliding window 数据加载器的输出DataLoader 位置编码Encoding word positions 自注意力机制 点积的原理 QKV的原理 实现代码 Multi-head Attention 线性层 github: LLMs-from-scratch/ch02/01_main-chapte…

MySQL之查询性能优化(六)

查询性能优化 查询优化器 9.等值传播 如果两个列的值通过等式关联&#xff0c;那么MySQL能够把其中一个列的WHERE条件传递到另一列上。例如&#xff0c;我们看下面的查询: mysql> SELECT film.film_id FROM film-> INNER JOIN film_actor USING(film_id)-> WHERE f…

四川汇聚荣聚荣科技有限公司综合实力怎么样?

在科技日新月异的今天&#xff0c;企业的综合实力成为衡量其市场竞争力的重要指标。四川汇聚荣聚荣科技有限公司作为一家在行业内具有一定影响力的企业&#xff0c;其综合实力如何&#xff0c;自然成为外界关注的焦点。以下将从多个维度深入分析该公司的实力。 一、公司概况与核…