【c++】list详细讲解
> 作者简介:დ旧言~,目前大二,现在学习Java,c,c++,Python等
> 座右铭:松树千年终是朽,槿花一日自为荣。> 目标:熟悉list库
> 毒鸡汤:你的脸上云淡风轻,谁也不知道你的牙咬得有多紧。
> 望小伙伴们点赞👍收藏✨加关注哟💕💕

🌟前言
今天咱们学习list,咱们还是依照官网来学习:list::list - C++ Reference (cplusplus.com)
⭐主体
- list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。
- list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。
- list与forward_list非常相似:主要不同在于forward_list是单链表,只能单方向迭代。
- 与其他的序列式容器相比(array,vector,deque),list在任意位置进行插入、移除元素的执行效率更好。
- 与其他序列式容器相比,list和forward_list最大的缺陷是不支持任意位置的随机访问,比如:要访问list的第6个元素,必须从已知的位置(比如头部或者尾部)迭代到该位置。
- list还需要一些额外的空间,以保存每个节点的相关联信息。
咱们按照下面的图来学习list:
🌙list构造

这里就和vector的接口相似,我们这里简单举例就行:
#include<list>
#include<string>
#include<iostream>
using namespace std;int main()
{// 构造int类型的空容器list<int> lt1; // 构造含有3个2的int类型容器list<int> lt2(3, 2); for (auto e : lt2){cout << e << " ";}cout << endl;// 拷贝构造lt2list<int> lt3(lt2); for (auto e : lt3){cout << e << " ";}cout << endl;string s("hello");// 利用迭代器构造list<char> lt4(s.begin(), s.end()); return 0;
}
运行结果:
🌙list 插入和删除数据
| 函数声明 | 接口说明 |
| push_front | 在list首元素前面插入元素 |
| pop_front | 删除list首元素 |
| push_back | 在list尾部插入元素 |
| pop_back | 在list尾部删除元素 |
| insert | 在list指定的pos位置插入元素 |
| erase | 在list指定的pos位置删除元素 |
💫push_front和pop_front
举例:
int main()
{list<int> lt;// 头插数据lt.push_front(1);lt.push_front(2);lt.push_front(3);lt.push_front(4);lt.push_front(5);for (auto e : lt){cout << e << " ";}cout << endl;// 头删数据lt.pop_front();for (auto e : lt){cout << e << " ";}cout << endl;return 0;
}
运行结果:
💫push_back和pop_back
举例:
int main()
{list<int> lt;// 尾插数据lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);lt.push_back(5);for (auto e : lt){cout << e << " ";}cout << endl;// 尾删数据lt.pop_back();for (auto e : lt){cout << e << " ";}cout << endl;return 0;
}
运行结果:
💫insert
使用说明:
- 在指定位置插入数据。
- 在指定位置插入n个值为val的数。
- 在指定位置插入一段迭代器区间(左闭右开)。
举例:
int main()
{list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);lt.push_back(5);list<int>::iterator pos = find(lt.begin(), lt.end(), 2);//在2的位置插入0lt.insert(pos, 0); for (auto e : lt){cout << e << " ";}cout << endl;pos = find(lt.begin(), lt.end(), 3);//在3的位置插入3个6lt.insert(pos, 3, 6); for (auto e : lt){cout << e << " ";}cout << endl;vector<int> v{ 7, 7 };pos = find(lt.begin(), lt.end(), 1);//在1的位置插入2个7lt.insert(pos, v.begin(), v.end()); for (auto e : lt){cout << e << " ";}cout << endl;return 0;
}
运行结果:
💫erase
使用说明:
- 删除指定位置数据
- 删除指定迭代器区间中的数据。
举例:
int main()
{list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);lt.push_back(5);list<int>::iterator pos = find(lt.begin(), lt.end(), 2);// 删除2lt.erase(pos); for (auto e : lt){cout << e << " ";}cout << endl;pos = find(lt.begin(), lt.end(), 3);//删除3及其之后的元素lt.erase(pos, lt.end()); for (auto e : lt){cout << e << " ";}cout << endl;return 0;
}
运行结果:
🌙list 迭代器的使用
| 函数声明 | 接口说明 |
| begin+end | 返回第一个元素的迭代器 + 返回最后一个元素位置的迭代器 |
| rbegin+rend | 返回最后一个元素位置的迭代器 + 返回第一个元素的迭代器 |
说明:begin+end是正向迭代器,rbegin+rend是反向迭代器。
举例:
int main()
{string s("hello c++");list<char> lt(s.begin(), s.end());// 正向迭代器遍历容器list<char>::iterator it = lt.begin();while (it != lt.end()){cout << *it << " ";it++;}cout << endl;// 反向迭代器遍历容器list<char>::reverse_iterator rit = lt.rbegin();while (rit != lt.rend()){cout << *rit << " ";rit++;}cout << endl;return 0;
}
运行结果:

🌙list 获取数据
| 函数声明 | 接口说明 |
| front | 返回list的第一个节点值的引用 |
| back | 返回list的最后一个解节点值的引用 |
举例:
int main()
{list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);lt.push_back(5);cout << lt.front() << endl;cout << lt.back() << endl;return 0;
}
运行结果:
🌙list 容量大小
| 函数声明 | 接口说明 |
| empty | 检测list是否为空,是返回true,反之返回false |
| size | 返回list中元素的个数 |
举例:
int main()
{list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);lt.push_back(5);cout << lt.size() << endl;cout << lt.empty() << endl;
}
运行结果:

🌙list 相关操作函数
💫erase
使用说明:swap用于交换两个容器的内容。
举个栗子:
int main()
{list<int> lt1(3, 2);list<int> lt2(2, 3);lt1.swap(lt2); //交换两个容器的内容return 0;
}
运行结果:

💫clear
使用说明:clear用于清空容器,清空后容器的size为0。
举个栗子:
int main()
{list<int> lt(5, 6);lt.clear();return 0;
}
运行结果:

💫sort
使用说明:sort可以将容器当中的数据排序(升序)。
举个栗子:
int main()
{list<int> lt;lt.push_back(2);lt.push_back(1);lt.push_back(4);lt.push_back(3);lt.push_back(5);cout << "排序前:";for (auto e : lt){cout << e << " ";}cout << endl;lt.sort();cout << "排序后:";for (auto e : lt){cout << e << " ";}cout << endl;
}
运行结果:

💫resize
使用说明:
- 当所给值大于当前的size时,将size扩大到该值,扩大的数据为第二个所给值,若未给出,则默认为容器所存储类型的默认构造函数所构造出来的值。
- 当所给值小于当前的size时,将size缩小到该值。
举个栗子:
int main()
{list<int> lt(3, 0);for (auto e : lt){cout << e << " ";}cout << endl;//将size扩大为5,扩大的值为4lt.resize(5, 1);for (auto e : lt){cout << e << " ";}cout << endl;//将size缩小为2lt.resize(2); for (auto e : lt){cout << e << " ";}cout << endl;return 0;
}
运行结果:

💫remove
使用说明:remove可以移除指定元素。
举个栗子:
int main()
{list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(2);lt.push_back(3);lt.push_back(4);lt.push_back(5);for (auto e : lt){cout << e << " ";}cout << endl;// 删除容器当中值为2的元素lt.remove(2); for (auto e : lt){cout << e << " ";}cout << endl;return 0;
}
运行结果:

💫unique
使用说明:去除连续重复的元素(如果要去除所有重复的元素需要先排序)
举个栗子:
int main()
{list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(3);lt.push_back(2);lt.push_back(3);lt.push_back(2);for (auto e : lt){cout << e << " ";}cout << endl;// 去除连续重复的元素lt.unique();for (auto e : lt){cout << e << " ";}cout << endl;lt.sort();lt.unique();for (auto e : lt){cout << e << " ";}cout << endl;return 0;
}
运行结果:

💫reverse
使用说明:可以将容器当中元素的进行逆置。
举个栗子:
int main()
{list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);lt.push_back(5);for (auto e : lt){cout << e << " ";}cout << endl;// 逆置lt.reverse();for (auto e : lt){cout << e << " ";}cout << endl;return 0;
}
运行结果:

🌟结束语
今天内容就到这里啦,时间过得很快,大家沉下心来好好学习,会有一定的收获的,大家多多坚持,嘻嘻,成功路上注定孤独,因为坚持的人不多。那请大家举起自己的小手给博主一键三连,有你们的支持是我最大的动力💞💞💞,回见。

相关文章:
【c++】list详细讲解
> 作者简介:დ旧言~,目前大二,现在学习Java,c,c,Python等 > 座右铭:松树千年终是朽,槿花一日自为荣。 > 目标:熟悉list库 > 毒鸡汤:你的脸上云淡…...
C#面:在.NET中 类 System.Web.UI.Page 可以被继承吗?
可以。 它是 ASP.NET WebForms中的一个重要类,用于表示 Web 页面。通过继承 System.Web.UI.Page 类,可以创建自定义的 Web 页面,并在其中添加自己的逻辑和功能。 继承 System.Web.UI.Page 类的好处是,可以重用和扩展已有的功能。…...
AI:128-基于机器学习的建筑物能源消耗预测
🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的关键代码,详细讲解供…...
php基础学习之可变函数(web渗透测试关键字绕过rce和回调函数)
可变函数 看可变函数的知识点之前,蒟蒻博主建议你先去看看php的可变变量,会更加方便理解,在本篇博客中的第五块知识点->php基础学习之变量-CSDN博客 描述 当一个变量所保存的值刚好是一个函数的名字(由函数命名规则可知该值必…...
MongoDB聚合操作符:$acos
$acos操作符返回一个值的反余弦。从MongoDB4.2版本开始支持。 语法 { $acos: <expression> }$acos接受任何可被解析为值在-1到1之间的表达式,即:-1 < value < 1$acos返回值以弧度为单位,使用$radiansToDegrees操作符可以把输出…...
开源PDF工具 Apache PDFBox 认识及使用(知识点+案例)
文章目录 前言源码获取一、认识PDFBox二、导入依赖三、基础功能demo1:读取pdf所有内容demo2:读取所有页内容(分页)demo3:添加页眉、页脚demo4:添加居中45文字水印demo5:添加图片到右上角 参考文…...
微软.NET6开发的C#特性——委托和事件
我是荔园微风,作为一名在IT界整整25年的老兵,看到不少初学者在学习编程语言的过程中如此的痛苦,我决定做点什么,下面我就重点讲讲微软.NET6开发人员需要知道的C#特性,然后比较其他各种语言进行认识。 C#经历了多年发展…...
卷积神经网络的基本结构
卷积神经网络的基本结构 与传统的全连接神经网络一样,卷积神经网络依然是一个层级网络,只不过层的功能和形式发生了变化。 典型的CNN结构包括: 数据输入层(Input Layer)卷积层(Convolutional Layer&#x…...
python:使用GDAL库读取遥感影像指定行列数/经纬度坐标的像素值
作者:CSDN @ _养乐多_ 本文将介绍如何使用GDAL库来读取单波段遥感影像数据,如何获取指定行列位置的像素的经纬度坐标,并根据像素行列数或者经纬度坐标获取像素值。代码由python实现。 文章目录 一、读取影像二、获取指定行列位置的像素坐标三、根据地理坐标获取像素值四、根…...
Redis篇----第一篇
系列文章目录 文章目录 系列文章目录前言一、什么是 Redis?二、Redis 与其他 key-value 存储有什么不同?三、Redis 的数据类型?四、使用 Redis 有哪些好处?五、Redis 相比 Memcached 有哪些优势?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住…...
C语言-----用二维数组解决菱形的打印问题
1.打印菱形,多组输入,一个整数(2~20),表示输出的行数,也表示组成“X”的反斜线和正斜线的长度。 #include <stdio.h>int main() {int n0;while(scanf("%d",&n)! EOF){int i0;int j0;f…...
.NET Core WebAPI中使用swagger版本控制,添加注释
一、效果 二、实现步骤 在代码中添加注释 在项目属性中生成API文档 在Program中注册Swagger服务并配置文档信息 // 添加swagger注释 builder.Services.AddSwaggerGen(x > {x.SwaggerDoc("v1", new OpenApiInfo { Title "Swagger标题", Version "…...
css篇---移动端适配的方案有哪几种
移动端适配 移动端适配是指同一个页面可以在不同的移动端设备上都有合理的布局。主流实现的方案有 响应式布局通过rem或者vw,vh 等实现不同设备有相同的比例而实现适配 首先需要了解viewport 【视口】 视口代表了一个可看见的多边形区域(通常来说是矩形࿰…...
一、部署Oracle
部署Oracle 一、Docker部署1.Oracle11g1.1 测试环境1.1.1 拉取镜像1.1.2 启动容器1.1.3 配置容器环境变量1.1.4 修改sys、system用户密码1.1.5 创建表空间1.1.6 创建用户并授权1.1.5 使用DBeaver测试连接 二、安装包部署 一、Docker部署 1.Oracle11g 1.1 测试环境 当前只能用…...
11-编写自动化测试
上一篇: 10-通用类型、特质和生命周期 Edsger W. Dijkstra 在 1972 年发表的文章《The Humble Programmer》中说:"程序测试可以非常有效地显示错误的存在,但对于显示错误的不存在却无能为力。这并不意味着我们不应该尽可能多地进行测试&…...
爱上JVM——常见问题(一):JVM组成
1 JVM组成 1.1 JVM由那些部分组成,运行流程是什么? 难易程度:☆☆☆ 出现频率:☆☆☆☆ JVM是什么 Java Virtual Machine Java程序的运行环境(java二进制字节码的运行环境) 好处: 一次编写&…...
C#系列-EF扩展框架AutoMapper应用实例(40)
AutoMapper是一个对象到对象的映射器,它用于将一个对象的属性映射到另一个对象的属性。它主要用于在应用程序的不同层之间传输数据时,自动将数据传输对象(DTOs)映射到领域模型,或者将领域模型映射到视图模型等。 下面…...
DataX源码分析-插件机制
系列文章目录 一、DataX详解和架构介绍 二、DataX源码分析 JobContainer 三、DataX源码分析 TaskGroupContainer 四、DataX源码分析 TaskExecutor 五、DataX源码分析 reader 六、DataX源码分析 writer 七、DataX源码分析 Channel 八、DataX源码分析-插件机制 文章目录 系列文章…...
容器高级知识: 适配器模式与 Sidecar 模式的区别
适配器模式与 Sidecar 模式的区别 在 Kubernetes 中,适配器模式和 Sidecar 模式都是扩展您的主应用程序容器功能的方法,但它们具有不同的目的和功能: Sidecar 模式: 通用目的: 为主应用程序提供 补充功能࿰…...
使用Xdisplay将ipad作为扩展显示器Agent闪退问题
1. 正常流程贴子挺多,可以参考这几篇 https://blog.csdn.net/Shi_Xueqing/article/details/129744496 如何将ipad作为win10的扩展屏(使用USB线连接)_ipad win usb 上网-CSDN博客 2.在进行pc端软件设置的时候发生闪退 解决方法:…...
OpenHarmony ArkUI Toggle组件实战:红蓝药丸选择器开发详解
1. 项目概述与设计思路最近在整理OpenHarmony应用开发的学习笔记,发现很多初学者在接触到ArkUI的声明式开发范式时,对于如何将UI组件与用户交互、状态管理结合起来,总感觉隔着一层纱。理论看了不少,但一到自己动手,就不…...
ADXL335模拟传感器读数不稳?手把手教你用Arduino进行软件滤波与校准
ADXL335模拟传感器读数不稳?手把手教你用Arduino进行软件滤波与校准 当你把ADXL335加速度计接入Arduino,兴奋地跑起第一个测试程序时,那些跳动的数字可能很快会浇灭你的热情。原始读数像得了疟疾般颤抖,静止时本该稳定的1g重力加速…...
LrcHelper:3分钟掌握网易云音乐双语歌词下载,告别歌词烦恼
LrcHelper:3分钟掌握网易云音乐双语歌词下载,告别歌词烦恼 【免费下载链接】LrcHelper 从网易云音乐下载带翻译的歌词 Walkman 适配 项目地址: https://gitcode.com/gh_mirrors/lr/LrcHelper 你是否曾为找不到心爱歌曲的歌词而烦恼?或…...
终极FGO自动化助手:告别枯燥刷本,每天节省3小时游戏时间
终极FGO自动化助手:告别枯燥刷本,每天节省3小时游戏时间 【免费下载链接】FGA Auto-battle app for F/GO Android 项目地址: https://gitcode.com/gh_mirrors/fg/FGA Fate/Grand Automata(简称FGA)是一款专为Fate/Grand Or…...
3分钟完成30分钟任务:词达人自动化助手终极指南
3分钟完成30分钟任务:词达人自动化助手终极指南 【免费下载链接】cdr 微信词达人,高正确率,高效简洁。支持班级任务及自选任务 项目地址: https://gitcode.com/gh_mirrors/cd/cdr 你是否厌倦了每周在词达人平台上花费数小时完成枯燥的…...
从零构建情感大语言模型:基于EmoLLM的实践指南
1. 项目概述:当大语言模型学会“察言观色”最近在折腾一个挺有意思的开源项目,叫SmartFlowAI/EmoLLM。光看名字你可能就猜到了,这玩意儿跟“情绪”和“大语言模型”有关。没错,它的核心目标就是让冷冰冰的LLM(Large La…...
保姆级避坑指南:用STM32F103C8T6+ESP8266(AT指令)做WiFi遥控小车,我踩过的那些坑
STM32F103C8T6ESP8266 WiFi遥控小车避坑实战手册 1. 硬件选型与连接:那些容易被忽视的细节 在开始任何代码编写之前,硬件连接的正确性往往决定了项目的成败。使用STM32F103C8T6(俗称"蓝莓板")与ESP8266模块组合时&#…...
Arm Neoverse CMN-700缓存一致性互连网络架构解析
1. Arm Neoverse CMN-700架构概述Arm Neoverse CMN-700是Arm公司推出的新一代缓存一致性互连网络(Coherent Mesh Network)解决方案,专为高性能计算、云计算和基础设施应用设计。作为多核处理器系统中实现高效数据共享的关键基础设施ÿ…...
C语言结构体:从‘学生信息管理‘到‘链表实现‘的保姆级跃迁指南(含typedef避坑)
C语言结构体:从学生信息管理到链表实现的实战进阶 在C语言的世界里,结构体就像是一个神奇的收纳盒,它能够将不同类型的数据打包成一个整体。想象一下,当你需要管理学生信息时,不再需要为姓名、学号、成绩等分别定义变量…...
如何高效使用Diablo Edit2:暗黑破坏神II存档修改的全面解决方案
如何高效使用Diablo Edit2:暗黑破坏神II存档修改的全面解决方案 【免费下载链接】diablo_edit Diablo II Character editor. 项目地址: https://gitcode.com/gh_mirrors/di/diablo_edit 想要在暗黑破坏神II中打造理想角色,却苦于漫长的刷怪过程&a…...







