我与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,一经查实,立即删除!

相关文章

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

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

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、编译并安装到…

数字化供应链:背景特点

​背景 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;可以分为底部导航、顶部…

8617 阶乘数字和

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

怎么找到DNS服务器的地址?

所有域都注册到域名名称服务器&#xff08;DNS&#xff09;点&#xff0c;以解析域名应指向的IP地址。此查找类似于在查找个人名称并查找其电话号码时的电话簿如何运行。如果DNS服务器设置错误或指向错误的名称服务器&#xff0c;则域可能无法加载相应的网页。 如何查找当前的…

(3)Java 8 实战第二版——使用流和Lambda进行高效编程

集合工厂 List<String> friends Arrays.asList("Raphael", "Olivia"); friends.set(0, "Richard"); friends.add("Thibaut"); ←---- 抛出一个UnsupportedModificationException异常通过工厂方法创建的Collection的底层…

CrossViT:用于图像分类的交叉注意多尺度Vision Transformer

提出了一种双支路Transformer来组合不同大小的图像补丁(即变压器中的令牌)以产生更强的图像特征。方法处理具有不同计算复杂度的两个独立分支的小补丁和大补丁令牌,然后这些令牌纯粹通过注意多次融合以相互补充。此外,为了减少计算量,开发了一个简单而有效的基于交叉关注的令…

C++基础编程100题-020 OpenJudge-1.3-20 计算2的幂

更多资源请关注纽扣编程微信公众号 http://noi.openjudge.cn/ch0103/20/ 描述 给定非负整数n&#xff0c;求2n。 输入 一个整数n。0 < n < 31。 输出 一个整数&#xff0c;即2的n次方。 样例输入 3样例输出 8参考程序-1 #include<bits/stdc.h> using nam…

JavaScript高级程序设计(第四版)--学习记录之对象、类和面向对象编程(中)

创建对象方式 工厂模式&#xff1a;用于抽象创建特定对象的过程。可以解决创建多个类似对象的问题&#xff0c;但没有解决对象标识问题。&#xff08;即新创建的对象是什么类型&#xff09; function createPerson(name, age, job) { let o new Object(); o.name name; o.age…

Android:移动垃圾软件

讲解政策相关,最近升级AI扫荡系统和证书防高风险,回复按留言时间来排,请耐心等待 移动垃圾软件 官方政策公告行为透明、信息披露清晰保护用户数据不要损害移动体验软件准则反垃圾软件政策Google API 服务用户数据政策官方政策公告 ​ 在 Google,我们相信,如果我们关注用户…

Retrofit源码阅读

动态代理在 Android 中的应用&#xff1a;Retrofit 源码解析 在之前的文章 《Andriod 网络框架 OkHttp 源码解析》 中我们分析了 OkHttp 的源代码。现在我们就来分析一下 OkHttp 的兄弟框架 Retrofit。关于 Retrofit 的注解的使用&#xff0c;可以参考其官方文档&#xff1a;h…

控制台厂商配额查询

概述 厂商推送限制 每个厂商通道都有对应的厂商配额和 QPS 限制&#xff0c;当请求超过限制且已配置厂商回执时&#xff0c;MobPush会采取以下措施&#xff1a; 当开发者推送请求超过厂商配额时&#xff0c;MobPush将通过自有通道进行消息下发。当开发者推送请求超过厂商 QPS…

Spark on k8s 源码解析执行流程

Spark on k8s 源码解析执行流程 1.通过spark-submit脚本提交spark程序 在spark-submit脚本里面执行了SparkSubmit类的main方法 2.运行SparkSubmit类的main方法&#xff0c;解析spark参数&#xff0c;调用submit方法 3.在submit方法里调用doRunMain方法&#xff0c;最终调用r…

算法-位图与底层运算逻辑

文章目录 1. 位图的理论基础2. 完整版位图实现3. 底层的运算逻辑-位运算 1. 位图的理论基础 首先我们要理解什么是位图, 位图的一些作用是什么 位图法就是bitmap的缩写。所谓bitmap&#xff0c;就是用每一位来存放某种状态&#xff0c;适用于大规模数据&#xff0c;但数据状态又…

Python+Pytest+Allure+Yaml+Pymysql+Jenkins+GitLab接口自动化测试框架详解

PythonPytestAllureYaml接口自动化测试框架详解 编撰人&#xff1a;CesareCheung 更新时间&#xff1a;2024.06.20 一、技术栈 PythonPytestAllureYamlJenkinsGitLab 版本要求&#xff1a;Python3.7.0,Pytest7.4.4,Allure2.18.1,PyYaml6.0 二、环境配置 安装python3.7&…