我与C++的爱恋:list的使用


外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

🔥个人主页guoguoqiang. 🔥专栏我与C++的爱恋

Alt

一、list介绍

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

list可以双向迭代,本质就是双向循环链表

二、接口函数

构造函数

在这里插入图片描述
1.默认构造函数创建一个没有任何元素的空链表。
2.填充构造函数允许创建一个包含特定数量相同值的元素的链表。
3.范围构造函数可以从任何提供迭代器接口的其他容器复制元素。
4.拷贝构造函数创建了一个当前list的副本。

填充构造函数前面的explicit关键字表明这个构造函数不能用于隐式转换或复制初始化,它需要直接调用来构造对象。其他构造函数则根据是否带有explicit关键字来决定是否能用于隐式转换或复制初始化

迭代器

在这里插入图片描述
迭代器用来遍历链表。

int main() {list<int> it = { 1,2,3,4,5,6,10 };list<int>::iterator i1 = it.begin();while (i1 != it.end()) {cout << *i1 << " ";i1++;}cout << endl;for (auto e : it) {cout << e << " ";}cout << endl;return 0;
}


容量操作

在这里插入图片描述
empty检测list是否为空,是返回true,否则返回false
size返回有效元素个数的值

元素访问

在这里插入图片描述
front返回list的第一个节点值的引用
back返回list的最后一个节点值的引用

内容操作

在这里插入图片描述
insert在这里不会出现迭代器失效

迭代器失效即迭代器所指向的节点的无效,即该节点被删除了。因为list的底层结构为带头结点的双向循环链表,因此在list中进行插入时是不会导致list的迭代器失效的,只有在删除时才会失效,并且失效的只是指向被删除节点的迭代器,其他迭代器不会受到影响

void TestListIterator1()
{int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };list<int> l(array, array + sizeof(array) / sizeof(array[0]));auto it = l.begin();while (it != l.end()){l.erase(it);++it;}
}

erase()函数执行后,it所指向的节点已被删除,因此it无效,在下一次使用it时,必须先给其赋值

void TestListIterator()
{int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };list<int> l(array, array + sizeof(array) / sizeof(array[0]));auto it = l.begin();while (it != l.end()){it = l.erase(it);//这行代码就在删除后更新了it}
}

在list中erase失效只影响被删除的元素,但是对于其他的容器(vector、deque)可能就不能这样了,因为这些容器的erase操作可能会影响被删除的元素之后的元素的迭代器全部失效。

operations

在这里插入图片描述
list 提供了一些有用的成员函数,允许执行各种操作,如元素的合并、移除、排序和倒序。
1.splice: 将元素从一个列表转移到另一个列表,可以转移整个列表、一个单独的元素或一个元素范围。

int main() {list<int> list1 = { 1, 2, 3 };list<int> list2 = { 4, 5, 6 };list1.splice(list1.end(), list2);list<int>::iterator i1 = list1.begin();while (i1 != list1.end()) {cout << *i1 << " ";i1++;}cout << endl;//1 2 3 4 5 6return 0;
}

2.remove: 从列表中移除所有具有特定值的元素。

int main() {list<int> list1 = { 1, 2, 3,3,3,5,6 };list1.remove(3);list<int>::iterator i1 = list1.begin();while (i1 != list1.end()) {cout << *i1 << " ";i1++;}cout << endl;//1 2 5 6return 0;
}

3.remove_if: 根据一个判断条件移除元素。

int main() {list<int> list1 = { 1, 2, 3,3,3,5,6 };list1.remove_if([](int n) { return n % 2 == 0; });list<int>::iterator i1 = list1.begin();while (i1 != list1.end()) {cout << *i1 << " ";i1++;}cout << endl;return 0;
}

在这里插入图片描述

4.unique: 移除连续并且重复的元素,只保留唯一的元素。
在这里插入图片描述

int main() {list<int> list1 = { 1, 2, 3,3,3,5,5,6,6,8,9 };list1.unique();list<int>::iterator i1 = list1.begin();while (i1 != list1.end()) {cout << *i1 << " ";i1++;}cout << endl;return 0;
}

5.merge: 合并两个已排序的列表,并确保结果列表也是排序的。
在这里插入图片描述

int main() {std::list<int> list1 = { 1, 3, 5 };std::list<int> list2 = { 2, 4, 6 };list1.merge(list2);list<int>::iterator i1 = list1.begin();while (i1 != list1.end()) {cout << *i1 << " ";i1++;}cout << endl;return 0;
}

6.sort: 对列表中的元素进行排序。它接受一个比较函数作为参数(可选)。
在这里插入图片描述

int main() {std::list<int> list1 = { 4, 3, 5, 2, 1 };list1.sort();list<int>::iterator i1 = list1.begin();while (i1 != list1.end()) {cout << *i1 << " ";i1++;}cout << endl;return 0;
}

7.reverse: 反转列表中元素的顺序。

int main() {std::list<int> list1 = { 5,4, 3,  2, 1 };list1.reverse();list<int>::iterator i1 = list1.begin();while (i1 != list1.end()) {cout << *i1 << " ";i1++;}cout << endl;return 0;
}

在这里插入图片描述

本篇内容到此结束,感谢大家的观看!!!

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

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

相关文章

华为OCR 腾讯OCR 百度OCR 三家各分秋色 第一当属华为

当提及华为OCR的应用场景时&#xff0c;这些是常见的使用案例&#xff1a; 金融行业&#xff1a;在银行和金融机构中&#xff0c;华为OCR技术广泛用于身份证件识别、银行卡识别和票据识别。这些功能可以用于客户身份验证、快速开户以及自动化的支付处理。 政府服务&#xff1a…

浅析Estimator、model_fn与EstimatorSpec

参考阅读&#xff1a;https://zhuanlan.zhihu.com/p/74857888 文章目录 综合对比Estimatormodel_fnEstimatorSpec关系总结 Estimator主要功能构造函数参数示例用法小结 model_fnEstimatorSpec字段解释解释代码用途 综合对比 Estimator、model_fn 和 EstimatorSpec 是 TensorF…

西电811考研、140分专业课及811/821经验

被拟录取了&#xff0c;说一说自己考研经验&#xff0c;本人跟的研梦考研全程班&#xff0c;胖覃学长很负责任&#xff0c;貌似已经直博西电了&#xff0c;但也很负责。 1、通信工程学院分为学硕与专硕&#xff0c;学硕包含信息与通信工程、交通运输工程、军队指挥学&#xff…

Perl语言中的排序艺术:深入探讨内置排序函数

Perl是一种功能强大的脚本语言&#xff0c;以其灵活的文本处理能力而闻名。在Perl中&#xff0c;排序是一项常见的任务&#xff0c;无论是对数组元素进行排序&#xff0c;还是对复杂数据结构进行排序&#xff0c;Perl都提供了多种内置的排序函数&#xff0c;以满足不同的需求。…

深入掌握Symfony与Composer:PHP依赖管理的艺术

引言 Composer是PHP的依赖管理工具&#xff0c;广泛用于Symfony等现代PHP应用程序中。它允许开发者声明依赖项&#xff0c;自动处理依赖的安装和更新&#xff0c;确保应用程序的依赖项得到有效管理。本文将详细介绍Composer的使用方法&#xff0c;包括基本命令、依赖管理、自动…

Linux环境安装配置nginx服务流程

Linux环境的Centos、麒麟、统信操作系统安装配置nginx服务流程操作&#xff1a; 1、官网下载 下载地址 或者通过命令下载 wget http://nginx.org/download/nginx-1.20.2.tar.gz 2、上传到指定的服务器并解压 tar -zxvf nginx-1.20.1.tar.gzcd nginx-1.20.1 3、编译并安装到…

条件过滤检索

背景介绍 在大多数业务场景中&#xff0c;单纯使用向量进行相似性检索并无法满足业务需求&#xff0c;通常需要在满足特定过滤条件、或者特定的“标签”的前提下&#xff0c;再进行相似性检索。 向量检索服务DashVector支持条件过滤和向量相似性检索相结合&#xff0c;在精确满…

数字化供应链:背景特点

​背景 1、外部环境 近年来&#xff0c;供应链脆弱性凸显&#xff0c;企业供应链压力难以缓解。 美国媒体针对美国零售联合会、美国服装和鞋类协会、美国供应链管理专业委员会等主体进行的一项供应链调查显示&#xff1a; 61%的供应链经理预计&#xff0c;供应链紊乱问题至少…

C++(第一天-----命名空间和引用)

一、C/C的区别 1、与C相比   c语言面向过程&#xff0c;c面向对象。   c能够对函数进行重载&#xff0c;可使同名的函数功能变得更加强大。   c引入了名字空间&#xff0c;可以使定义的变量名更多。   c可以使用引用传参&#xff0c;引用传参比起指针传参更加快&#…

企业化运维(5)_mysql数据库

###1.源码编译mysql### 对压缩包进行解压&#xff0c;并对mysql进行源码编译&#xff0c;其中需要下载依赖才能编译成功。 官网&#xff1a; www.mysql.com解压并进入目录 [rootserver1 ~]# tar xf mysql-boost-5.7.40.tar.gz [rootserver1 ~]# cd mysql-5.7.40/安装依赖性…

初识Java(复习版)

一. 什么是Java Java是一种面向对象的编程语言&#xff0c;和C语言有所不同&#xff0c;C语言是一门面向过程的语言。偏底层实现&#xff0c;比较注重底层的逻辑实现。不能一味的说某一种语言特别好&#xff0c;每一种语言都是在特定的情况下有自己的优势。 二.Java语言发展史…

昇思25天学习打卡营第2天|yulang

今天主要了解快速入门&#xff0c;主要包含了处理数据集、网络构建、模型训练、保存模型和加载模型&#xff0c;这些对于不是算法工程师理解起来可能稍微有一点的难度&#xff0c;学习起来有点枯燥&#xff0c;期待后续实战部分能完成一些独立的比较有意思的项目。

鸿蒙项目实战-月木学途:2.自定义底部导航

效果预览 Tabs组件简介 Tabs组件的页面组成包含两个部分&#xff0c;分别是TabContent和TabBar。TabContent是内容页&#xff0c;TabBar是导航页签栏&#xff0c;页面结构如下图所示&#xff0c;根据不同的导航类型&#xff0c;布局会有区别&#xff0c;可以分为底部导航、顶部…

使用ECharts实现动态数据可视化的最佳实践

使用ECharts实现动态数据可视化的最佳实践 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 引言 随着数据驱动决策的重要性日益增强&#xff0c;动态数据可视…

第二十站:Java未来光谱——量子计算与新兴技术的展望

Java作为一门成熟且广泛使用的编程语言&#xff0c;其在传统计算领域已经取得了巨大的成功。然而&#xff0c;随着量子计算等新兴技术的出现&#xff0c;Java也在探索其在这些领域的应用潜力。IBM Qiskit是一个开源的量子计算软件框架&#xff0c;它允许开发者使用多种编程语言…

登录验证码高扩展性设计方案

登录验证码高扩展性建设方案 本文分享了一种登录验证码高扩展性的建设方案&#xff0c;通过工厂模式策略模式&#xff0c;增强了验证码服务中验证码生成器、验证码存储器、验证码图片生成器的扩展性&#xff0c;实现了服务组件的多样化&#xff0c;降低了维护成本 登录验证码高…

8617 阶乘数字和

这是一个关于计算阶乘结果所有位上的数字之和的问题。我们可以通过以下步骤来解决这个问题&#xff1a; 1. 首先&#xff0c;我们需要一个函数来计算阶乘。由于n的范围可以达到50&#xff0c;阶乘的结果可能非常大&#xff0c;所以我们需要使用一个可以处理大整数的数据类型&a…

adb shell logcat -b all|grep如何可以grep两个子串?

在adb shell logcat命令中结合grep来过滤日志时&#xff0c;如果你想要同时匹配两个子串&#xff0c;你可以使用管道&#xff08;|&#xff09;将两个grep命令连接起来&#xff0c;或者使用grep的-E&#xff08;或egrep&#xff0c;它等同于-E&#xff09;选项来支持扩展的正则…

[课程][原创]opencv图像在C#与C++之间交互传递

opencv图像在C#与C之间交互传递 课程地址&#xff1a;https://edu.csdn.net/course/detail/39689 无限期视频有效期 课程介绍课程目录讨论留言 你将收获 学会如何封装C的DLL 学会如何用C#调用C的DLL 掌握opencv在C#和C传递思路 学会如何配置C的opencv 适用人群 拥有C#…

报错:pathspec ‘xxx‘ did not match any file(s) known to git

在 escode 中进行分支切换时报如下错误 PS > git checkout xxx error: pathspec xxx did not match any file(s) known to git远程分支已经在 gitlab 客户端手动创建&#xff0c;在 escode 中也使用了拉取之类的操作&#xff0c;但是切换分支时依然报错。 解决方案 查看分…