深入解析:list的迭代器

news/2025/11/13 21:30:00/文章来源:https://www.cnblogs.com/gccbuaa/p/19219604

1.list介绍

list在stl中是一种相当重点的容器,他的底层逻辑是我们之前的数据结构中的链表,而且这里是一种带头双向循环链表。
在这里插入图片描述
这是较为官方的文档介绍,大致意思就是:

  1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。
  2. list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中凭借指针指向其前一个元素和后一个元素。
  3. 单链表,只能朝前迭代,已让其更便捷高就是list与forward_list非常相似:最主要的不同在forward_list
    效。
  4. 与其他的序列式容器相比(array,vector,deque)list通常在任意位置进行插入、移除元素的执行效率
    更好。
  5. 与其他序列式容器相比,list和forward_list最大的缺陷是不支持任意位置的随机访问,比如:要访问list的第6个元素,必须从已知的位置(比如头部或者尾部)迭代到该位置,在这段位置上迭代需要线性的时间开销;list还需要一些额外的空间,以保存每个节点的相关联信息(对于存储类型较小元素的大list来说这可能是一个重点的因素
    list的图解:
    在这里插入图片描述
    就是这个图解的部分,故而list的建立可以说,大家大家都非常熟悉,可是list的难点在于他的迭代器实现,所以本章标题也围绕着list的迭代器。

2.list的使用

2.1list的构造

1:list(size_type n,const value_type&val=value_type())
主要用于构造list中囊括的n个值为val的元素。
2:list()构造空list
3:list(const list&x)拷贝构造函数
4:list (InputIterator first, InputIterator last),用(first,last)区间中的元素构造list

2.2list的iterator的采用

还是那句话,list可以理解为一个指针,指向list中的某个节点。
在这里插入图片描述
注意:
1:begin于end为正向迭代器,对迭代器执行++运行,迭代器向后移动
2:rbegin(end)于rend(beegin)为反向迭代器,对迭代器执行++操控,迭代器向前移动

2.3list的capacity问题

在这里插入图片描述

2.4list的元素管理

1:push_front
2:pop_front
3:push_back;
4:pop_back
5:insert
6;erase
7:swap 用于交换两个list中的元素
8:clear 清空list中的元素
相信有了之前链表的学习,大家都知道,上面的接口都怎么启用,代表什么意思。

3.关于list的迭代器失效

list的迭代器失效情况,较为单一,最常见的就是erase后还访问pos处的位置,这就是完完全全的野指针访问了,一般情况下的erase接口的返回值一般是iterator,返回删除节点下一个节点的指针。

4.list的模拟达成

节点,大家不能对齐,直接利用,要求对list的迭代器单独完成。就是list的模拟建立,同我们之前的双向链表的搭建,一样,不同的是,这里的list是容器,而为了和算法进行配合,就多了一个迭代器,多这个迭代器不要紧,要紧的是这个迭代器全是坑,因为对比vector来说,list的存储形式并不连续,而且存储的

4.1实现list的三个类

list是双向链表,所以实现链表就必须要有节点,然后之前我们提到的迭代器类,以及最后才是我们的list类。
总结:
节点,迭代器,list

4.2list节点类的封装

回顾我们之前自主实现链表的代码,节点的三个成员分别是next,prev,以及最后的data
在这里插入图片描述
有了这个类,大家做许多事情就方便的多,基于后续有list的增删改查,大部分都要创建新节点,有了这个类,我们只用:
Node* newnode=new Node;
这样我们就创建了与新的节点。

4.3list类的完成

因为我们之前说过,list是一种带头双向循环的链表,因此我们的list成员只用封装一个头节点_head即可:
在这里插入图片描述
下面是对头节点的初始化
在这里插入图片描述
接下来是实现list的size接口,其实就是寻找有几个节点,因此我们就行利用迭代器的遍历完成。
在这里插入图片描述
还有一个非常核心的接口那就是插入接口,相信双向链表的增删改查大家都知道,我这里就不多解释,只提供代码了:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.list迭代器类的封装

这里我们提到过list的迭代器是一个重点,它不同于之前的string以及vector,他并不是连续储存的,所以访问它不能直接进行++或–的操作,同时,我们对于迭代器的要求是我们可能用迭代器
iteartor it
来来搭建对list中信息的访问,而不是节点的访问,因此节点的指针就不能用了,综合以上,我们只有对list的节点指针进行再封装,让其单独成为一个类,这时我们才能更好的达成后续的访问。

5.1list迭代器的成员

list迭代器的模拟实现是封装和重载
该节点:就是封装就是让其成为一个单独的类,重载就是当大家访问iterator时,看着是访问节点,实则是访问节点中的数据。因而,我们迭代器类的成员只有一个,那就
在这里插入图片描述

5.2迭代器的重载

5.2.1解引用的重载

我们说了,解引用节点的地址,实则要解引用节点中存储数据的地址,因此,我们的解引用操作要实现,返回节点中的数据。
在这里插入图片描述

5.2.2箭头符号重载

箭头符号于解引用的操作相同,所以我们返回的不是节点的指针,而是节点中资料的指针:
在这里插入图片描述

5.2.3++的重载

我们知道迭代器有一个重点的玩法就是,当我们++时,迭代器就指向了下一个元素,而这里我们的迭代器要构建的就是返回下一个节点的地址,所以其逻辑和链表的遍历差不多:
在这里插入图片描述

5.2.4!=符号的重载

我们使用迭代器进行遍历时,一定有一种使用方法,那就是
while(it!=ls.end());
所以我们就要搭建!=符号的重载。
同样也是比较两个节点的地址,不用比较数据
在这里插入图片描述
注意上面我的注释,带你重温以下类和对象的内容:
因为的it.end()的返回值时iterator的传值返回,所以会生成一个iterator的临时对象,而临时对象具有常性,因此我们这里的形参就必须是const的

5.3const迭代器实现优化

现在大家上面实现了一个普通迭代器的封装重载,不过还有一个重要的迭代器,就是const迭代器要怎么实现呢?或许你会这样想:
typedef const iterator const_iterator
之后重新写一个类,来搭建const迭代器,(注意这里的const迭代器,指的是节点里的数据是const的,而不是节点是const的故而 list const iterator是错误的用法),但是你有没有想到过,我们这两种迭代器的不同,仅仅只是接口返回值的不同,其他的函数体都一样,那为什么我们不套用模板,来搭建不同迭代器的复用呢?是不是一种特别漂亮的做法。
在这里插入图片描述
不同的iterator,这样就通过模板实现了,迭代器的复用。就是我们套用不同的迭代器种类,他就

6.总结

我们list的类还有很多接口没有实现,我这里不写其一是有些接口确实不常用,其二就是我们已经谢过了string类和vector类,对数据结构肯定有了自己的认识,所以就不再赘述了,这篇文章主要还是为了,让大家搞明白,list的迭代器。

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

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

相关文章

通过元素定位其各种层级关系元素的工具

# element_relation_locator.py # 通过元素定位其各种层级关系元素的工具from appium.webdriver.common.appiumby import AppiumByclass ElementRelationLocator:"""元素关系定位器类,用于通过元素定位…

2025年11月五金打包机,称重打包机,半自动打包机厂家品牌推荐榜,彰显包装设备技术实力!

在当前制造业智能化转型的关键阶段,五金、紧固件等行业对包装设备的技术要求日益提升,高效、精准、稳定的打包设备成为企业提升生产效率、控制成本的核心支撑。在众多包装设备厂家中,温州工友自动包装设备有限公司凭…

题解:P1393 Mivik 的标题

更差的阅读体验这也太深刻了。 我们考虑一个 dp。我们假设 \(f_i\) 表示考虑前 \(i\) 个字符,\([i - |S| + 1: i]\) 这一段存在一个 \(S\) 的匹配,并且前 \(i\) 个字符不存在别的位置有 \(S\) 匹配的方案数。 那么我…

appium包含文本定位的5种方法

# appium定位,以text包含部分文字定位示例# 方法1: 使用XPath的contains函数进行text部分匹配 from appium.webdriver.common.appiumby import AppiumBydef locate_element_by_partial_text(driver, partial_text):&q…

C++ const总结

1、const 修饰普通变量 C/C++中常量用于记录程序中不可更改的数据,在数据类型前加const,就得到了一个不可更改的常量。常量声明:const用于定义常量const int MAX = 100;//MAX的值在程序运行期间无法被修改,所以必须…

11.13 程序员的修炼之道:从小工到专家 第五章 弯曲或折断 - GENGAR

这五节内容围绕软件设计的解耦、灵活性、协作效率展开,提出了多项关键原则与模型。解耦是贯穿始终的核心,得墨忒耳法则明确了对象方法调用的边界,仅允许调用自身、参数、创建对象及直接持有组件的方法,减少模块间依…

20251112周三日记

20251112周三日记今日: 1.早上九点多起床,下去登一下ow卡死进不去了。上课时接到家里消息。准备交简历、连梯子看3b1b教程。 2.下午看完了deepia老师的diffusion介绍,下载了本书,学了会儿,太他妈复杂了全是数学推…

力扣 第 475 场周赛(A~C)

力扣 第 475 场周赛(A~C)$(".postTitle2").removeClass("postTitle2").addClass("singleposttitle");A:3740. 三个相等元素之间的最小距离 I见B。 B:3741. 三个相等元素之间的最小距离…

学习笔记:AC 自动机

最智慧的,不是避免所有失败,而是在失配时借力转向,让每一次跌倒都成为新模式的起点。—— 题记其实我两周前就学了 AC 自动机,本来不应该现在才写这个笔记的。但是当时对 AC 自动机的理解比较模糊,直到刚才听了风…

详细介绍:Web爬虫指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

搜维尔科技:具身人工智能中的 MANUS:从人类运动到机器人灵巧性

灵巧的机器人手正成为具身人工智能的基石。动作捕捉、仿真、强化学习和自监督基础模型的最新进展,使得机器人能够执行越来越接近人类的操作技能。 复制人手的精确性、适应性和触觉控制能力(人手由27块骨头、数十块肌…

重组蛋白技术基础概述

重组蛋白的基本概念 重组蛋白是通过基因重组技术在宿主系统中表达的外源蛋白。该技术将目标基因导入表达载体,转化至宿主细胞,利用细胞自身的转录翻译机制合成目标蛋白。与传统组织提取相比,重组技术可获得更高纯度…

升鲜宝分拣系统 具体实现(一)

升鲜宝分拣系统 具体实现(一)按商品分拣1.商品汇总(分页)2.客户汇总(分页)3.分拣一条商品4.撤消一条已分拣商品5.缺货一条订单商品记录6.一条订单商品记录的操作记录7.获取分拣的商品分类8.获取分拣的线路列表9.分…

2025-11-13

1.Problem - 1881E - Codeforces(1500)(dp) dp好题 #include <bits/stdc++.h> using namespace std; #define LL long long const LL mod = 998244353; const int N=2e5+10; int a[N], inf = 1e9, dp[N];voi…

字典树小记

普通字典树 没什么好讲的 0-1 Trie 非常有用,经常用于异或相关的题目 求一个集合中两两异或的最大值 枚举集合中的一个数 \(x\),按位贪心,如果这一位有一个与 \(x\) 不同的,那么字典树上走这一边,否则走 \(x\) 的…

搜维尔科技:Xsens Link为精准而生,为创意而设计,为动作捕捉性能树立了新的标准

行业领先的动作捕捉服 新一代Xsens Link专为追求精准、可靠和行动自由的专业人士打造,这款全新的eSuit配备17个一键式传感器,内置线缆,安装时间缩短50%。Link经过重新设计,可提供最精准、最稳定的运动数据,树立了…

一个好题2

一个好题的题解题目传送门 欢迎光临我的博客 遇到这种题,我们首先有一个套路:拆贡献。我们把答案拆到每条边上,这样的话只需要加上 每条边在所有合法方案里出现的次数之和 \(\times\) 这条边的长度即可。 那一条边会…

实用指南:百分点科技发布中国首个AI原生GEO产品Generforce,助力品牌决胜AI搜索新时代

实用指南:百分点科技发布中国首个AI原生GEO产品Generforce,助力品牌决胜AI搜索新时代pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important;…

考前复习

Floyd 字符串哈希 单调栈/单调队列 三分 ST 表 最小生成树 最近公共祖先(LCA) dij SPFA 缩点 tarjan(割点,割边,点双,边双,判环 ) 线段树,树状数组 欧拉路径 矩阵快速幂 全源最短路(Johnson) 两个排列的最长公…

2025 年 11 月粮库空调厂家最新推荐,聚焦资质、案例、售后的实力品牌深度解析!

在粮食储备行业,粮库空调的性能直接关系到粮食品质与存储安全,随着全球粮食储备技术升级,市场对高精度、高稳定性粮库空调的需求持续增长。本次 2025 年 11 月粮库空调厂家推荐,参考国际制冷协会(IIR)、国际粮食…