反向迭代器

news2024/11/15 5:00:30

文章目录

  • 1. list的反向迭代器
  • 2. list的rbegin和rend
  • 3. 反向迭代器的实现
    • 3.1 复用vector反向迭代器
    • 3.2 反向迭代器的变化

1. list的反向迭代器

我们先来看一看库里面的list的迭代器是如何写的:
在这里插入图片描述
这是list的正向迭代器。
在这里插入图片描述
这是list的反向迭代器。
其实大佬们是把正向迭代器封装适配了一下,生成了反向迭代器
在这里插入图片描述
原因是:和正向迭代器相比,除了++/- -方向相反,其它操作基本一致

那么我们就来看一下库里面的写法:
在这里插入图片描述
从上面就可以看出,它通过一个正向迭代器的成员变量来完成反向迭代器的工作。在下面我们要注意以下两点:
在这里插入图片描述
反向迭代器的解引用是正向迭代器前一个位置,箭头也是如此
在这里插入图片描述
反向迭代器的++是正向迭代器的- -,- -是正向迭代器++

2. list的rbegin和rend

我们先来看一下库里面是如何设计的:
在这里插入图片描述
它的rbegin就是end,rend就是begin。
在这里插入图片描述
这种设计也叫做对称设计。当我们执行下面代码时。

rit=rbegin();
while(rit!=rend())
{
	*rit;
	++rit;
}

所以当解引用时,它是解引用前一个位置的数据。++时其实是正向迭代器的- -,- -就是正向迭代器的++。

3. 反向迭代器的实现

我们先按照正向迭代器那样,自己去写一下:
在这里插入图片描述
还是和正向迭代器一样,我们要进行返回。因为要传const和非const两种,我们需要在模板参数多添加两种:
在这里插入图片描述
因为这个模板类型,我们可以typedef一下,方便以后使用。
在这里插入图片描述
然后我们将一些函数也写一下:
在这里插入图片描述
然后我们要在list类里面把rbegin和rend写出来:
在这里插入图片描述
在这里插入图片描述
我们来测试一下:
在这里插入图片描述
这样其实没什么问题。那么const修饰的我们也写一下:
在这里插入图片描述
在这里要注意:把const的放在上面写,不然定义的reverse_iterator会影响。
在这里插入图片描述

3.1 复用vector反向迭代器

vector和list也是一样的:
在这里插入图片描述
在这里插入图片描述
然后我们来测试一下:
在这里插入图片描述
我们看到没有问题。所以当我们写好一份反向迭代器时,就可以复用到其它容器里,不需要重复写了。

3.2 反向迭代器的变化

可能有的同学会在这里问:库里面写的反向迭代器只有一个模板类型,为什么这里我们写了三个。原因是:库里面早期也是这样实现的,但是后面加了一些修改:
在这里插入图片描述
其实一个参数时,最大的问题是它们两个返回值的问题。我们需要这样做:
在这里插入图片描述
其实在每个迭代器里面都会有这些定义。然后会这样写:
在这里插入图片描述
我们去这个迭代器类域里找这两个。但是这里还有一点问题:没有实例化之前不能去它里面找内嵌定义的类型。因为类模板没有实例化,找出来也是虚拟类型,编译器不认识,后期无法处理
我们可以这样:
在这里插入图片描述
这个typename意思就是:告诉编译器后面这一串是一个类型,等Iterator实例化以后,在去它里面找这个内嵌类型
在这里插入图片描述
我们可以看到list这样写也是没有问题的,但是这种写法vector不行。
在这里插入图片描述
因为vector的迭代器是一个原生指针,它没有内嵌类型。list可以是因为它的迭代器是自定义类型,里面可以去设置。那么解决的办法就是:
在这里插入图片描述
自己把这个原生指针里包装一下,然后在里面去设置reference和pointer的一些东西。其实标准库里没有使用这种方法,而是一种叫做迭代器萃取的技术来完成的,但是这个技术太复杂了,就不说了。

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

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

相关文章

【3.1】Eureka注册中心-提供者与消费者/原理分析

【3.1】Eureka-提供者与消费者/原理分析1 提供者与消费者2 服务调用出现的问题3 Eureka的作用3.1 消费者该如何获取服务提供者具体信息?3.2 如果有多个服务提供者,消费者该如何选择?3.3 消费者如何感知服务提供者健康状态?4 总结1…

A. The Enchanted Forest #769 div1

Problem - A - Codeforces 题意&#xff1a; 给你一串序列&#xff0c;任意从什么地方开始&#xff0c;给你k秒时间&#xff0c;让你算最大价值 每一秒时间按顺序你可以做&#xff1a; ①移动到|x-y|<1的地方 ②取走这个位置上所有的数 ③每个位置1 原来是0秒&#x…

opencv-python常用函数解析及参数介绍(七)——边缘检测

边缘检测前言1.基本概念1) 滤波2) 计算梯度3) 非极大值抑制4) 双阈值检测2.opencv中的边缘检测效果展示分析对比3.结尾前言 在之前的文章中我们介绍了使用膨胀和腐蚀、计算图像梯度的方式来获取图像的轮廓&#xff0c;本篇文章将介绍另外一种可以获取图像轮廓的方法——边缘检…

再说原型链

关于原型链&#xff0c;已经被无数次的提起&#xff0c;每次回顾都有新的理解&#xff0c;今天我们再来说说原型链。 我们知道&#xff0c;每一个javascript对象&#xff08;除了null&#xff09;在被创建的时候都会与另一个对象关联起来&#xff0c;这个对象就是我们所说的原型…

【C++进阶】二叉搜索树

文章目录二叉搜索树概念二叉搜索树操作二叉搜索树的实现每个节点的结构插入查找删除二叉搜索树的所有代码(包括测试)版本一版本二test.cpp二叉搜索树概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树: 若它的左子树不为空&a…

Linux环境下gdb程序调试

目录gdb介绍进入gdb调试环境指令学习l(list)指令b(break)指令info b指令d指令r(run)指令n(next)指令s(step)指令c(continue)指令bt(breaktrace)指令finish指令p(print)指令display指令undisplay指令until指令disable命令enable命令这篇文章将会介绍gdb以及一些常用的gdb调试指令…

3.移动端百分比布局练习-京东首页

访问地址 https://youthddup.gitee.io/myproject/ 1、项目目录结构 2、注意 &#xff08;1&#xff09;设置视口标签以及引入初始化样式 &#xff08;2&#xff09;二倍精灵图缩放 先把精灵图等比缩放原来的一半 然后再测精灵图位置 代码里background-size置为原来的一半 &a…

typescript 数组操作

使用变量来存储值会带来以下限制&#xff1a; 变量本质上是标量。换言之&#xff0c;一个变量声明变量声明一次只能包含一个。这意味着在程序中存储n个值需要n个变量声明。因此&#xff0c;当需要存储更大的值集合时&#xff0c;使用变量是不可行的。 程序中的变量以随机顺序分…

当下一场数字化的浪潮,正在各行各业深刻上演着

一场数字化的浪潮&#xff0c;正在各行各业深刻上演着。在零售领域&#xff0c;亦不例外。以往&#xff0c;提及零售&#xff0c;我们更多地想到的是&#xff0c;各式各样的电商平台&#xff0c;我们看到的是&#xff0c;各式各样的电商模式&#xff1b;现在&#xff0c;提及零…

测试用例设计-淘宝购物车

测试人员和开发人员产生争执了怎么办&#xff1f; ① 先检查自身&#xff0c;是否BUG描述不清楚 ② 站在用户的角度考虑问题 ③ BUG定级要有理有据 ④ 提高自身的技术能力和业务水平&#xff0c;最好同时提出解决方案。 ⑤ 开发人员不接受时&#xff0c;不要争吵&#xff0c;可…

YOLOv5更换骨干网络之 PP-LCNet

论文地址&#xff1a;https://arxiv.org/abs/2109.15099 代码地址&#xff1a;https://github.com/ngnquan/PP-LCNet 我们提出了一种基于MKLDNN加速策略的轻量级CPU网络&#xff0c;名为PP LCNet&#xff0c;它提高了轻量级模型在多个任务上的性能。本文列出了在延迟几乎不变的…

YOLOv5更换骨干网络之 EfficientNet-B0

论文地址&#xff1a;https://arxiv.org/abs/1905.11946 代码地址&#xff1a;https&#xff1a;//githeb.com/TensorFlow/tpu/tree/master/Models/Offical/Efficientnet 卷积神经网络(ConvNet)通常是在固定的资源预算下开发的&#xff0c;如果有更多的资源可用&#xff0c;则…

如何从macOS ventura降级到 macOS Monterey?这两大方法可以帮到你

苹果发布了macOS 13 Ventura的正式版系统&#xff0c;增加了许多实用性的功能&#xff0c;大家纷纷下载更新最新版本的系统。但根据许多已安装ventura的用户反馈&#xff0c;这个版本的MacOS系统还不够成熟&#xff0c;应该有不少bug还没有修复过来&#xff0c;从而求助小编分享…

c#入门-泛型约束

泛型约束 使用泛型时会假设泛型占位符是任何类型。 但因为它被假设是任何类型&#xff0c;所以使用起来有很大的限制。只有所有类型都有的功能&#xff0c;他才能用。 为了满足所有的可能类型&#xff0c;可用的操作非常少。 为此我们可以为泛型占位符添加约束。虽然会让能兼…

大型项目迭代流程

一、回顾目标 总目标&#xff1a; 年底上线完成100% 结果&#xff1a; 年底上线并开量验证过成功&#xff0c;完成率100% 阶段目标A&#xff1a; 10月底项目全流程开发完成&#xff0c;并提测出票前流程 结果&#xff1a;10月21日项目开发完成100%&#xff0c;10月25日前…

基于残差神经网络的交通标志识别算法研究与应用实现

问题&#xff1a; 从图像中识别交通标志对于自动驾驶至关重要。要想实现自动驾驶&#xff0c;车辆必须了解并遵守所有交通规则。当前&#xff0c;特斯拉、谷歌、梅赛德斯-奔驰、丰田、福特、奥迪等许多大公司都在研究自动驾驶。因此&#xff0c;为了实现这项技术的准确性&…

pandas的series创建和pandans的dataFrame创建

一&#xff1a;series和读取外部数据 1.1pandas的series的了解 1.1.1 为什么要学习pandas numpy能够帮我们处理处理数值型数据&#xff0c;但是这还不够。很多时候&#xff0c;我们的数据除了数值之外&#xff0c;还有字符串&#xff0c;还有时间序列等 比如&#xff1a;我们通…

显式利用用户画像的多兴趣建模

显式利用用户画像的多兴趣建模 目前在多兴趣建模中&#xff0c;用户侧的特征包括用户基础画像特征&#xff08;年龄、性别、地域等&#xff09;、用户在当前场景的静态兴趣画像特征&#xff08;短期兴趣画像、长期兴趣画像&#xff09;、交互的历史正向行为序列特征&#xff0…

【Javassist】快速入门系列13 使用Javassist获取注解

系列文章目录 01 在方法体的开头或结尾插入代码 02 使用Javassist实现方法执行时间统计 03 使用Javassist实现方法异常处理 04 使用Javassist更改整个方法体 05 当有指定方法调用时替换方法调用的内容 06 当有构造方法调用时替换方法调用的内容 07 当检测到字段被访问时使用语…

MySQL性能优化三 一条SQL在MySQL中执行的过程

一 MySQL的内部组件结构 大体来说&#xff0c;MySQL 可以分为 Server 层和存储引擎层两部分。 1.1 service层 主要包括连接器、查询缓存、分析器、优化器、执行器等&#xff0c;涵盖 MySQL 的大多数核心服务功能&#xff0c;以及所有的内置函数&#xff08;如日期、时间、数学…