STL-reverse_iterator 反向迭代器

news2024/11/30 2:46:02

回顾

对于STL中的容器,迭代器(iterator)是很重要的部分,同时迭代器也是STL六大组件之一,在之前我们实现vector和list中,我们已经对于迭代器有了初步的认识,为什么设计迭代器? 就是为了能像数组中的指针一样,可以通过++ , -- 的操作遍历数据。

比如说vector,它本身底层就是一个数组,一串连续的数据,而它的迭代器就是原生指针。

而list,它并不是连续存储的空间,但是可以通过每个节点的_next指针找到下一个节点(数据),而它的迭代器是一个类,类的底层成员是节点指针,再重载++,--操作,就能像vector一样遍历数据。

反向迭代器(reverse_iterator)

反向迭代器,就是迭代器(正向迭代器)的反过来遍历,从尾部向头部遍历,这个不难理解。

正向迭代器,我们知道,它是一个左闭右开的区间,那么反向迭代器,是怎么样的一个区间呢?

这个问题我们先放着,大家可以思考一会。

如果我们要实现一个反向迭代器,是否又要写一个反向迭代器的实现?这是否会与我们实现的正向迭代器的代码大幅度相似? 对于STL来说,太多重复的代码会显得很臃肿浪费,那么STL是如何实现反向迭代器的呢?

STL对于反向迭代器的实现,采用了适配器的做法,对正向迭代器进行了封装。而对于适配器,我们已经了解了stack,queue等。所以,反向迭代器,不仅仅是迭代器,还是适配器!

反向迭代器作为适配器适配在什么地方?STL让能支持逆序遍历的容器都能把各自的正向迭代器适配出各自的反向迭代器!

template<typename Iterator , typename Ref, typename Ptr>
	struct __reverse_iterator {
		typedef __reverse_iterator<Iterator, Ref, Ptr> RIterator;

		Iterator _data;    //成员变量

        __reverse_iterator(Iterator it)
			:_data(it)
		{}

	};

这里模版的第一个参数是你需要适配的正向迭代器,第二个和第三个参数与正向迭代器一致,是用来识别判断你这个迭代器是否是const的。

怎么反向遍历?不过是把正向迭代器的++操作,替换成了--操作!

RIterator& operator++()
{
	--_data;
	return *this;
}

RIterator operator++(int)
{
	__reverse_iterator tmp(_data);
	--_data;
	return tmp;
}

RIterator& operator--()
{
	++_data;
	return *this;
}

RIterator operator--(int)
{
	__reverse_iterator tmp(_data);
	++_data;
	return tmp;
}

反向迭代器区间

那么已经知道了反向迭代器的运作原理,是否对于它的遍历区间有了一些猜想?

而STL是这样设计的

 以vector为例

Ref operator*()
{
	Iterator tmp = _data;
	return *(--tmp);
}

Ptr operator->()    //针对自定义类型指针访问成员
{
	return &(operator*());
}

bool operator!=(const RIterator& it)
{
	return _data != it._data;
}

RIterator rbegin()
{
	return RIterator(end());
}

const_RIterator rbegin() const
{
	return RIterator(end());
}

RIterator rend()
{
	return RIterator(begin());
}

const_RIterator rend() const
{
	return RIterator(begin());
}

而反向迭代器的遍历则是这样

vector<int> v1;
v1.push_back(1);
v1.push_back(2);
v1.push_back(3);
v1.push_back(3);
v1.push_back(3);
v1.push_back(6);
v1.push_back(4);
vector<int>::RIterator Rit = v1.rbegin();
while (Rit != v1.rend())
{
	cout << *Rit << " ";
	++Rit;
}
cout << endl;

反向迭代器不仅仅是迭代器,还是一个适配器,写一个反向迭代器就能造福许多容器,为什么是许多而不是全部?  因为有些容器的迭代器不支持--操作,就比如单向链表,不支持逆序遍历。

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

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

相关文章

虹科干货|创新求变:虹科Redis企业版数据库驱动金融实时业务

BDO调查显示&#xff0c;43%的金融企业正计划全力加速数字化转型&#xff0c;互联网巨头与金融科技初创公司正在颠覆传统。”与此同时&#xff0c;客户行为、消费习惯和期望持续变化&#xff0c;以客户为中心的快速金融服务已成趋势&#xff0c;企业微服务、云原生应用亟需一组…

【算法题解】30. 全排列的递归解法

这是一道 中等难度 的题 https://leetcode.cn/problems/permutations/ 题目 给定一个不含重复数字的数组 n u m s nums nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[1…

景点解说二维码怎么做?一键教你轻松生成二维码

现在的各种景区为了节省人工都会将景点的详细讲解做成二维码。通过手机扫码就能自助导览。那么&#xff0c;大家知道这种景区讲解二维码是怎么制作的吗&#xff1f; 一、什么工具能制作二维码图片&#xff1f; 机智熊二维码生成器&#xff08;https://www.jzx.com/&#xff09;…

什么是高性能计算实习生?做高性能计算有前景吗?

随着大模型和算力时代的大火&#xff0c;高性能计算实习的岗位越来越多了&#xff0c;各个大厂都在码人&#xff0c;百度、小米、字节、华为等等&#xff0c;也有很多网友晒出了面试一众知名芯片企业的面经和笔试题。 但是依然有很多朋友不清楚什么是高性能计算实习生&#xf…

搜索推荐系统[10]项目实战系列Z1:手把手教学(商品搜索系统、学术文献检索)语义检索系统搭建、召回排序模型详解。

搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排)、系统架构、常见问题、算法项目实战总结、技术细节以及项目实战(含码源) 专栏详细介绍:搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排)、系统架构、常见问题、算法项目实战总结、技术…

每日一练 | 网络工程师软考真题 Day12

阅读以下说明&#xff0c;答复以下【问题1】至【问题3】 【说明】 某单位有1个总部和6个分部&#xff0c;各个部门都有自己的局域网。该单位申请了6个C类IP地址202.115.10.0/24~202.115.15.0/24&#xff0c;其中总部与分部4共用一个C类地址。现方案将这些部门用路由器互联&…

linuxOPS基础_操作系统概述

计算机发展史 第一台计算机是1946 年2 月14 日诞生日&#xff0c;第一台名称ENIAC。体积一间屋子的大小&#xff0c;重量高达28t。 第一代&#xff1a;1946 – 1958 > 12 年 &#xff08;电子管&#xff09; 第二代&#xff1a;1958 – 1964 > 6 年 &#xff08;晶体管…

VR数字展厅——助力商企实现数字化营销展示

近年来&#xff0c;随着元宇宙、虚拟现实等概念逐渐进入大众视野&#xff0c;VR虚拟展厅也慢慢的发展成为了一种新的展示形式。VR数字展厅可以将展示场景复刻在线上&#xff0c;不再受限于线下环境&#xff0c;随着VR全景技术的高速发展&#xff0c;虚拟展厅帮助商企实现更具创…

一起CPU很闲,load却很大的案例分析

1、软硬件环境 硬件&#xff1a; 飞腾E2000Q 平台 软件&#xff1a; linux 4.19.246 2、问题现象 系统在上电后&#xff0c;无意中发现系统的平均负载很大&#xff0c;数值显示远超过cpu的承载能力。心想也没有跑什么业务程序呀&#xff0c;吓得赶紧运行top命令&#xff0c;瞅…

无人车端到端驾驶模型概述

摘要&#xff1a; 通常&#xff0c;端到端驾驶模型使用一个深度神经网络来完成这种映射&#xff0c;网络的所有参数为联合训练而得。这种方法因它的简洁高效而引人关注。 引言 在搭建无人车时&#xff0c;我和小伙伴们的主要工作是建立一个驾驶模型。所谓的驾驶模型是控制无人…

idea模板配置

idea版本&#xff1a;2023.1 未设置模板的idea&#xff0c;新建类会自动生成类注释 格式如下&#xff1a; /*** author user* date 2023/5/20 0020 14:25*/ public class User {} 其中&#xff0c;user为当前用户名 这里&#xff0c;如果希望将类注释改写成如下&#xff0…

“卷”还是“躺平”?职场人如何在工作中找到价值感?

今天不谈技术&#xff0c;只谈进步。 曾经看过一个回答说“职场人最好的姿势是仰卧起坐”。 卷累的就躺&#xff0c;休息好了再继续卷&#xff0c;卷是常态&#xff0c;“仰卧起坐”也好&#xff0c;“卷的姿势”也好&#xff0c;都是在反复“卷起”的过程中寻找一些舒适和平衡…

Z-Library2023现状

网上基本上年年都会传出来Z-Library要被干掉的消息&#xff0c;我一直觉得&#xff0c;如果那真的发生了&#xff0c;会是人类的悲哀。 由于之前我存储的地址又挂了&#xff0c;所以紧急又寻找了一下。 1.朋友帮忙 朋友帮我搜了一下&#xff0c;发现有三个地址。 他说这第一个…

智能CAN/串口协议转换器LCNET Pro RS-232/485

智能CAN/串口协议转换器LCNET Pro RS-232/485提供一路RS-485、一路RS-232和一路CAN通道&#xff0c;实现CAN与串口RS-485或RS-232之间的双向数据智能转换。每个通道独立隔离&#xff0c;每路通道采用金升阳电源模块和信号隔离芯片实现2500VDC电气隔离&#xff0c;电源输入防反设…

基于Redis的Java分布式锁,接口并发处理,并发方案

Redis的分布式锁很多人都知道&#xff0c;比如使用Jedis的setNx、incr等方法都可以实现分布式锁的功能&#xff0c;但是Jedis需要自己管理连接池&#xff0c;就稍微麻烦一点。 今天介绍的是使用RedisTemplate切面编程自定义注解SPEL来实现分布式锁的功能&#xff0c;封装完成后…

Spring Cloud 容错机试 Hystrix 服务降级 RestTemplate:

Ribon的服务降级操作 雪崩效应&#xff1a; 如果短信服务炸了后面的所有服务就会起连锁反应造成全部服务挂掉&#xff0c;这就是雪崩效应&#xff0c;那么其实短信服务又不是我们主要业务&#xff0c;这个时候我们可以采用服务降级&#xff0c;服务降级就是暂时的把短信服务停…

java学习——ArrayList和泛型(学习记录)

学习资料来自菜鸟教程 ArrayList 类是一个可以动态修改的数组&#xff0c;与普通数组的区别就是它是没有固定大小的限制&#xff0c;我们可以添加或删除元素。 ArrayList 继承了 AbstractList &#xff0c;并实现了 List 接口。 ArrayList 类位于 java.util 包中&#xff0c;使…

事件驱动模型IO模型

什么是事件驱动模型&#xff1f; 事件驱动模型是一种计算机编程模型&#xff0c;它通过等待事件的触发&#xff0c;在事件被触发时执行对应的处理函数。这种模型下&#xff0c;程序不再按照严格的顺序执行命令&#xff0c;而是以事件为驱动进行执行。事件驱动模型更适合处理大…

[RSA议题分析] Finding Vulnerabilities through Static Analysis and Scripting

文章目录 简介议题分析发现漏洞 - 什么时候/为什么什么是漏洞挖掘漏洞价值 如何挖洞逆向工程环境从哪开始挑战 总结 简介 作者讲了挖漏洞的目标&#xff0c;和一些常用的挖漏洞的方法和如果你像现在开始挖掘二进制漏洞&#xff0c;那么你可以从memcpy开始。除此之外&#xff0…

【SpringBoot系列】Spring EL表达式的简介和快速入门

介绍 Sping EL&#xff08;Spring Expression Language 简称 SpEL&#xff09;是一种强大的表达式语言&#xff0c;支持在运行时查询和操作对象&#xff0c;它可以与 XML 或基于注解的 Spring 配置一起使用。语言语法类似于统一 EL&#xff0c;但提供了额外的功能,方法调用和字…