C++之迭代器分类与List容器的使用

news2024/10/7 6:45:47

目录

迭代器的分类

List容器

​编辑

总结


在Vector容器中我们学习了迭代器,知道了迭代器的作用和使用方法,本期我们将进一步学习迭代器的概念以及list容器的使用。

迭代器的分类

以算法库中的两个算法为例:

sort算法是用来排序的,reverse算法是用来进行容器的逆置,但是们发现了两个类似迭代器Iterator的东西,但是又与我们之前看到的迭代器不相同,那么这两个迭代器究竟是什么呢?下来为大家一一介绍。 

声明:所有迭代器都是模板类型,所以站在语法层面,所有的迭代器变量都可以作为实参传给迭代器类型,但是在使用的角度这是行不通的,什么类型的迭代器,就应该传什么类型的迭代器变量。

1.只读/只写迭代器(output_iterator/input_iterator)

 这种迭代器并没有实际对应的类型,我们可以认为,这种迭代器是最基本的类型,其它所有的迭代器都是从此迭代器衍生出来的。

2.单向迭代器(forward_iterator)

单向迭代器,其实就只能进行迭代器的++操作,最典型的就是forward_list,unordered_set和unorder_map容器。

3.双向迭代器(bidirectional_iterator)

双向迭代器,其实就是可以进行迭代器的++和--操作,最典型的就是list,map和set容器。

4.随机迭代器(randomaccess_iterator) 

随机迭代器,其实就是可以进行迭代器的++,--,+和-操作,最典型的就是deque,vector和string。

其实不难发现,往下的每个迭代器都是对上述每个迭代器功能的补充,这个就像后期我们学习到的继承的概念,子类可以继承父类的属性,也有自己独有的属性。继承中还有一个很重要的概念就是切片,这个内容我们后期会为大家讲解,现在大家只需要记住一个概念即可,子类对象可以传给父类对象,但是父类对象不能传给子类对象。所以整个关系图如下图所示。

 所以模板如果是父类,那么父类之后所有的子类对象都可以进行传递,付过模板是子类,那么子类之前的父类是不能进行传递的。

reverse函数需要传递的参数类型应该是双向迭代器,但是由于随机迭代器是它的子类,所以也可以传随机迭代器,我们知道vector是随机迭代器所以用vector容器进行验证;由于单向迭代器是它的父类,所以不能传单向迭代器,我们知道forward_list是单向迭代器,所以我们用forward_list进行验证。

#include<iostream>
using namespace std;
#include<vector>
#include<forward_list>


int main()
{
	vector<int> v1;
	v1.push_back(1);
	v1.push_back(2);
	v1.push_back(3);
	v1.push_back(4);
    vector<int>::iterator it1 = v1.begin();
	while (it1 != v1.end())
	{
		cout << *it1 ;
		it1++;
	}
	cout << endl;
	reverse(v1.begin(), v1.end());
	vector<int>::iterator it2 = v1.begin();
	while (it2 != v1.end())
	{
		cout << *it2 ;
		it2++;
	}

	forward_list<int> l1;
	l1.push_front(1);
	l1.push_front(2);
	l1.push_front(3);
	l1.push_front(4);
	forward_list<int> ::iterator it3 = l1.begin();
	while (it3 != l1.end())
	{
		cout << *it3;
		it3++;
	}
	cout << endl;
	reverse(l1.begin(), l1.end());
	forward_list<int>::iterator it4 = l1.begin();
	while (it4 != l1.end())
	{
		cout << *it4;
		it4++;
	}
	return 0;
}

我们发现,vector容器的元素进行了逆置,也证明了子类可以传给父类。 

我们发现,forward_list容器的元素没有进行逆置, 也证明了父类不能传给子类。

以上便是迭代器分类的所有内容。

List容器

list容器是一个带头双向循环链表。

构造函数

构造函数大家只需要记住,list容器的空间是从空间配置器中申请的,至于空间配置器是什么,这个后期会为大家讲述。list同样可以使用迭代器区间进行构造,但是最有用的就是可以是一个空构造,因为本身已经有了缺省值。 

析构函数

 

 修改函数

 大部分的函数功能与vector容器类似,大家可以查看vector那一章节。但是要注意的是list中没有reserve功能,也就是没有扩容功能,因为list是链表链表的空间是用多少申请多少,不像vector数组,是不管是否使用直接申请一大块空间。

迭代器

迭代器的使用也与vector类似,大家可以参考vector的使用。

其实大家不妨仔细思考一下,这个begin和rebegin究竟有什么关系呢?

其实只要是双向迭代器或者是双向迭代器的子类都有这个功能,单向迭代器即双向迭代器的父类是没有这个功能的。

单向迭代器,forward_list容器的迭代器如下图。

 随机迭代器,vector容器的迭代器如下图。

查看文档之后,确实是这样的,究竟是为什么呢?

其实我们一开始就已经讲述了这个问题的答案,因为单向迭代器是不支持--操作的,双向迭代器和随机迭代器是支持--操作的,所谓的rebegin其实就是把正向迭代器的end作为了begin然后进行--,又把--封装成了++。但是单向迭代器是没有--操作的,所以不支持反向迭代器。

总的来说,stl库底层会对每个容器的功能进行封装,最后形成用户层看着类似的接口,所以只要学习了一个容器的接口之后,学习其它的容器的接口不过是照猫画虎,很容易上手。

总结

本期的内容主要讲解了迭代器的分类和list的基本使用,主要是迭代器的分类,总共分为四类,只读只写迭代器,单向迭代器,双向迭代器,随机迭代器。大家其实只需要记得它们的父子关系即可,在今后遇到模板传参的问题时,记住一句话“子类可以传给父类,但是父类不能传给子类”。list的基本操作其实和vector很相似,因为它们的接口都进行了封装,list的重点是下期我们要学习模拟实现。

本期内容到此结束^_^

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

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

相关文章

kafka-高可用设计详解(集群架构、备份机制、消费者组、重平衡)

文章目录 kafka高可用设计集群架构Kafka集群选举ISR与OSRLEO和HWKafka分区Leader选举Leader Replica选举策略Leader Replica选举过程 副本机制(Replication&#xff09;消费者组和再均衡消费者组再均衡(重平衡) 更多相关内容可查看 kafka高可用设计 Apache Kafka 的高可用设计…

【Flink】Flink SQL

一、Flink 架构 Flink 架构 | Apache Flink 二、设置TaskManager、Slot和Parallelism 在Apache Flink中&#xff0c;设置TaskManager、Slot和Parallelism是配置Flink集群性能和资源利用的关键步骤。以下是关于如何设置这些参数的详细指南&#xff1a; 1. TaskManager 设置 …

SAME70硬件擦除flash方法(ATSAME70Q21B-ANT

1.PB12高电平&#xff0c;当PB12置低电平时&#xff0c;将擦除所有数据&#xff1b; 2.ATSAME70Q21B-ANT芯片通过Microchip Studio 7.0仿真器烧录的…elf和hex等文件&#xff0c;读取之后&#xff0c;再烧写&#xff0c;还是可以使用&#xff0c;故需要锁定芯片代码&#xff…

Python27 神经网络中的重要概念和可视化实现

1. 神经网络背后的直观知识 神经网络的工作方式非常相似&#xff1a;它接受多个输入&#xff0c;经过多个隐藏层中的多个神经元进行处理&#xff0c;并通过输出层返回结果&#xff0c;这个过程在技术上称为“前向传播”。 接下来&#xff0c;将神经网络的输出与实际输出进行比…

STM32_hal库学习(2)-按键(中断/非中断)控制LED

在这篇文章我将使用两种方法实现按键控制&#xff0c;分别使用非中断控制和中断控制LED 非中断按键控制LED&#xff1a; 对于非中断实现按键控制led&#xff0c;我将直接从上一个工程led闪烁进行修改 STM32F103—Hal库的学习&#xff08;1&#xff09;LED灯闪烁-CSDN博客 非…

<sa8650>QCX ISP Tuning 使用详解 — Tuning前置条件

<sa8650>QCX ISP Tuning 使用详解 — Tuning前置条件 一 如何安装 Qualcomm Chromatix™ 摄像头校准工具二 如何使用 Qualcomm Chromatix™ tuning工具创建tuning项目2.1 创建工程前提依赖2.2 创建工程2.3 添加场景2.4 编辑区域触发器三 如何创建Tuning 树一 如何安装 Qualco…

TypeScript(笔记版)

简介&#xff1a; nvm安装必须先把自己的node卸了&#xff0c;再去安装nvm TS就是js的超集 对js进行了扩展 浏览器不支持ts&#xff0c;要转换为js才可以。 ts是用来编程人员爽的 js的写法拿到ts也可以&#xff0c;ts代码量更大&#xff0c;但ts代码更加清晰 可以在playg…

C++精解【8】

文章目录 运算,- 加减法* / 乘除法逐元 乘法逐元 除法逐元综合运算矩阵乘法与加减法 转置、共轭、伴随矩阵点乘法,叉积 运算 ,- 加减法 逐元加减法 #include <iostream> #include "e:/eigen/Eigen/Dense" using namespace std;int main() {Eigen::Matrix2d …

并发编程工具集——Lock和Condition(上)(十二)

简述&#xff1a;Java SDK 并发包通过 Lock 和 Condition 两个接口来实现管程&#xff0c;其中 Lock 用于解决互斥问题&#xff0c;Condition 用于解决同步问题。 再造管程的理由和期望 理由&#xff1a;synchronized 没有办法解决“破坏不可抢占条件方案”。 原因是synchroniz…

可燃气体报警器计量校准:重要性与实践指南

在燃气机锅炉房、酒店厨房以及天然气管路等关键场所&#xff0c;可燃气体检测报警器的准确性和可靠性直接关系到人们的生命安全和财产安全。因此&#xff0c;对可燃气体报警器进行定期的计量校准至关重要。 在这篇文章中&#xff0c;佰德将从校准的必要性、方法与步骤、实际案…

【知识学习】阐述Unity3D中动画渲染的概念及使用方法示例

Unity3D中的卡通渲染&#xff08;Cartoon Rendering&#xff09;是一种渲染技术&#xff0c;它模仿传统手绘动画或漫画的视觉效果。这种渲染风格通常具有鲜明的颜色、清晰的轮廓线和简化的光影效果&#xff0c;常用于制作动画、游戏和其他视觉媒体。 卡通渲染的基本概念 轮廓…

Ansible-playbook的逻辑控制 ②

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 在《Ansible-playbook的逻辑控制 ①》中&#xff0c;梳理了逻辑控制when的使用场景&#xff0c;本文则继续梳理学习loop与block块…

python调用nodeJs执行js代码

文章目录 安装环境二、python程序调用js代码示例 安装环境 需要安装nodejs、python python库安装 pip install PyExecJS2 二、python程序调用js代码 示例 js代码&#xff1a; function sum(a,b){return ab; }python代码 import execjsjs_codeopen(dejmo.js).read() js_…

springcloud第4季 分布式事务seata作用服务搭建1

一 seata作用 1.1 seata简介 1.seata是一款解决分布式事务的解决方案&#xff0c;致力于在微服务架构下提供高性能和简单易用的分布式事务服务。 1.2 seata的术语 一个中心&#xff1a;全局事务id&#xff0c;xid&#xff0c;在调用服务链路的上下文中进行传播。TC(Transa…

风机过滤机组介绍

一、定义 FFU英文全称为&#xff08;Fan Filter Unit&#xff09;&#xff0c;中文专业用语为风机过滤机组。FFU广泛应用于洁净室、洁净工作台、洁净生产线、组装式洁净室和局部百级等应用场合。 二、FFU的组成 FFU主要由四部分组成&#xff1a; 1.箱体 其材质常用镀锌铝合…

SpringBoot脚手架MySpringBootAPI(PgSQL+Druid+MyBatisPlus+Lombok)

MySpringBootAPI SpringBoot脚手架&#xff0c;基于SpringBootDruidPgSQLMyBatisPlusFastJSONLombok&#xff0c;其他的请自行添加和配置。 Author powered by Moshow郑锴(大狼狗) , https://zhengkai.blog.csdn.net 如何运行 1.首先确保你是JDK17&#xff0c;推荐微软的MSJDK…

[数据集][目标检测]游泳者溺水检测数据集VOC+YOLO格式8275张4类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;8275 标注数量(xml文件个数)&#xff1a;8275 标注数量(txt文件个数)&#xff1a;8275 标注…

5分钟,从购买域名到HTTPS访问

5分钟&#xff0c;从购买域名到HTTPS访问 架构师手把手教技术 大家好&#xff0c;最近很多小伙伴咨询关于在 安装nginx 和 部署SSL证书 方面的技术&#xff0c;因此我录制了这个视频&#xff0c;希望可以帮助大家更快速地掌握这些关键技能。 首先&#xff0c;让我们从购买域名…

【离散数学·图论】(复习)

一、基本概念 1.一些基本术语&#xff1a; 2.点u&#xff0c;v邻接&#xff08;或相邻&#xff09;: 边e称为关联顶点u和v,or e连接u和v; 3.G(V,E)中&#xff0c;顶点v所有邻居的集合&#xff1a;N(v), 成为v的邻域。 4.度 &#xff1a; deg(v) 5.悬挂点&#xff1a;度为1的…

「C系列」C 经典练习实例

文章目录 1. 基本输入输出2. 字符串操作3. 数组与循环4. 函数与递归5. 逻辑与条件6. 数学问题7. 数字与数学8. 数组与字符串9. 逻辑与条件10. 结构体和联合体11. 指针12. 文件操作13. 动态内存分配相关链接 C语言经典练习实例及详细代码可以涵盖多个方面&#xff0c;从基础输入…