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

目录

迭代器的分类

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的重点是下期我们要学习模拟实现。

本期内容到此结束^_^

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

常用MQ消息中间件Kafka、ZeroMQ和RabbitMQ对比及RabbitMQ详解

1、概述 在现代的分布式系统和实时数据处理领域&#xff0c;消息中间件扮演着关键的角色&#xff0c;用于解决应用程序之间的通信和数据传递的挑战。在众多的消息中间件解决方案中&#xff0c;Kafka、ZeroMQ和RabbitMQ 是备受关注和广泛应用的代表性系统。它们各自具有独特的特…

O2OA(翱途) 开发平台之HTTP端口规划

O2OA(翱途) 开发平台[下称O2OA开发平台或者O2OA]采用相对灵活的系统架构&#xff0c;支持三种服务器运行的方式。本篇主要阐述合并服务运行独立服务运行代理端口运行三种服务器运行方式。 一、先决条件&#xff1a; 1、O2Server服务器正常运行&#xff0c;系统安装部署请参考文…

Java基于jjwt操作jwt

之前讲解了jwt的相关知识&#xff0c;有不了解的&#xff0c;可以查看相关的文章JWT简介-CSDN博客&#xff0c;本节不再介绍&#xff0c;主要讲解有关java中如何通过jjwt库产生jwt以及解析jwt的相关操作。 添加maven依赖 <dependency><groupId>io.jsonwebtoken&l…

统信桌面操作系统上使用命令行添加软件图标到任务栏

原文链接&#xff1a;统信桌面操作系统上使用命令行添加软件图标到任务栏 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇在统信桌面操作系统上使用命令行添加软件图标到任务栏的文章。通过命令行将常用软件的图标添加到任务栏&#xff0c;可以快速启动软件&#xf…

网络抓包分析工具

摘要 随着网络技术的快速发展&#xff0c;网络数据的传输和处理变得日益复杂。网络抓包分析工具作为网络故障排查、性能优化以及安全审计的重要工具&#xff0c;对于提升网络管理的效率和准确性具有重要意义。本文旨在设计并实现一款高效、易用的网络抓包分析工具&#xff0c;…

Python实现数据库与Excel文件之间的数据导入与导出

数据库和Excel文件是两种常见且重要的数据存储方式。数据库通常用于大规模数据的高效存储、管理和查询&#xff0c;而Excel则以其直观的界面和简单的操作方式广泛应用于数据分析、报告生成和可视化等领域。在实际工作中&#xff0c;可能需要在这两者之间进行数据的导入与导出。…

网上零食销售系统

摘 要 随着互联网的快速发展&#xff0c;网上销售已成为零售业的重要组成部分。在众多的线上购物品类中&#xff0c;零食销售因其受众广泛、购买频率高、消费金额适中等特点&#xff0c;一直备受关注。然而&#xff0c;传统的零食销售方式&#xff0c;如实体店铺销售&#xff…

Python湍流隐式模型耗散粘性方程和大涡流模拟

&#x1f3af;要点 &#x1f3af;达朗贝尔一维波动通解&#xff0c;二维变速模拟 | &#x1f3af;达朗贝尔算子解双曲波形微分方程 | &#x1f3af;耗散系统粘性伯格斯方程快速傅里叶变换算法 | &#x1f3af;二维线性和非线性对流扩散解和湍流隐式建模 &#x1f4dc;偏微分方…

网络研究观:网络犯罪简报

通过犯罪研究人员精选的新闻提要了解最新的全球网络犯罪威胁。 了解不同的数字欺诈以及如何保护自己。 1. 网络犯罪分子冒充 CBI 和 IB 官员&#xff1a;KP 加尔各答警察局警告公民&#xff0c;诈骗者通过发送虚假的 CBI 和 IB 通知来勒索钱财&#xff0c;指控他们在线观看儿…

Avue框架学习

Avue框架学习 我们的项目使用的框架是 Avue 在我看来这个框架最大的特点是可以基于JSON配置页面上的From,Table以及各种各样的输入框等,不需要懂前端就可以很快上手,前提是需要多查一下文档 开发环境搭建 由于我本地的环境全是用docker来搭建的,所以我依然选择用docker搭建我…

【第二周】基础语法学习

目录 前言初始化项目文件介绍基本介绍JSWXMLWXSS 常见组件基础组件视图容器match-mediamovable-area/viewpage-containerscroll-viewswiper 表单组件自定义组件 模板语法数据绑定单向数据绑定双向数据绑定 列表渲染条件渲染模板引用 事件系统事件类型事件绑定阻止冒泡互斥事件事…

【开源项目】自然语言处理领域的明星项目推荐:Hugging Face Transformers

在当今人工智能与大数据飞速发展的时代&#xff0c;自然语言处理&#xff08;NLP&#xff09;已成为推动科技进步的重要力量。而在NLP领域&#xff0c;Hugging Face Transformers无疑是一个备受瞩目的开源项目。本文将从项目介绍、代码解释以及技术特点等角度&#xff0c;为您深…

《梦醒蝶飞:释放Excel函数与公式的力量》6.3NOW函数

6.3NOW函数 1&#xff09;NOW函数概述 NOW函数是Excel中一个非常实用的内置函数&#xff0c;它返回当前的日期和时间。这个函数可以自动更新&#xff0c;以反映打开工作簿时的确切日期和时间。 2&#xff09;函数语法 NOW函数的语法非常简单&#xff0c;因为它不需要任何参…

操作系统-中断和异常

中断和异常 用户态&#xff1a;普通应用程序运行在用户态&#xff0c;有很多权限限制 内核态&#xff1a;操作系统运行在内核态&#xff0c;有完全的权限访问和管理所有资源&#xff08;硬件&#xff0c;内存&#xff09; 中断的作用 把CPU从用户态变内核态 异常&#xff08…

前端性能优化-实测

PageSpeed Insights 性能测试 今天测试网站性能的时候发现一个问题&#xff0c;一个h2标签内容为什么会占据这么长的渲染时间&#xff0c;甚至有阶段测到占据了7000多毫秒&#xff0c;使用了很多方法都不能解决&#xff0c;包括了修改标签&#xff0c;样式大小等&#xff0c;当…

【C++题解】* 1266. 求最大数

问题&#xff1a;1266. 求最大数 类型&#xff1a;简单循环 题目描述&#xff1a; 问 555555 的约数中最大的三位数是多少&#xff1f; 输入&#xff1a; 无。 输出&#xff1a; 约数中最大的三位数。 完整代码如下&#xff1a; #include<bits/stdc.h> using nam…

基于weixin小程序乡村旅游系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;商家管理&#xff0c;旅游景点管理&#xff0c;景点类型管理&#xff0c;景点路线管理&#xff0c;系统管理 商家帐号账号功能包括&#xff1a;系统首页&#xff0c;旅游景点管理&…

【机器学习300问】132、自注意力机制(Self-Attention)和传统注意力机制(Attention)的区别?

最近学习注意力机制的时候&#xff0c;发现相同的概念很多&#xff0c;有必要给这些概念做一下区分&#xff0c;不然后续的学习可能会混成一团。本文先区分一下自注意力机制和传统注意力机制。我会先直接给出它们之间有何区别的结论&#xff0c;然后通过一个例子来说明。 【机…

2024最新!将mysql的数据导入到Solr

Solr导入mysql的数据 如何安装导入数据前准备配置Solr的Jar包以及Mysql驱动包1.1、将solr-8.11.3\dist下的两个包进行移动1.2、将mysql-connect包也移动到该位置1.3、重启Solr项目 配置xml2.1、第一步我们需要创建核心2.2、第二步修改xml(这里是结合19年的教程)2.3、 创建data-…

【力扣】有效的字母异位词

&#x1f525;博客主页&#xff1a; 我要成为C领域大神&#x1f3a5;系列专栏&#xff1a;【C核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 本博客致力于知识分享&#xff0c;与更多的人进行学习交流 给定两个字符串 s …