C++ stl中的list的相关函数用法
文章目录
- list的介绍
- list的使用
- 定义方式
- 插入和删除
- 迭代器的使用
- 获取元素
- 容器中元素个数和容量的控制
- 其它操作函数
list的使用,首先要包含头文件
#include <list>
list的介绍
1.list是一种可以在常数范围内在链表中的任意位置进行插入和删除的序列式容器,并且该容器能够前后双向迭代。
2.list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立结点当中,在结点中通过前驱指针指向其前一个元素和后继指针指向后一个元素。
3.list与forward_list非常相似,最主要的不同在于forward_list是单链表,只能进行单方向迭代。
4.与其它容器相比,list通常在某个位置进行插入、删除元素的执行效率更高。
5.list和forward_list最大的缺陷是不支持在任意位置的随机访问(即不能像vector一样,通过下标+[ ]进行元素访问),其次,list还需要一些额外的空间,以保存每个结点之间的关联信息(对于存储的类型较小元素来说这可能是一个重要的因素)。
list的使用
定义方式
方式一:
构造一个某类型的空容器
list<int> lt; //构造int类型的空容器
方式二:
构造一个含有n个val的某类型容器
list<int> lt2(5,1); //构造含有5个1的int类型容器
方式三:
对某类型的list容器进行拷贝构造
list<int> lt2(lt1); //对int类型的lt1容器进行拷贝构造
方式四:
对其它容器的一段内容进行拷贝构造
string s("hello world");
list<char> lt1(s.begin(),s.end()); //对string对象某段区间的拷贝构造
方式五:
对数组的某段区间进行拷贝构造
int arr[] = { 1, 2, 3, 4, 5 };
int len = sizeof(arr) / sizeof(arr[0]);
list<int> lt1(arr, arr + len); //对数组的某段区间进行拷贝构造
插入和删除
1.push_front和pop_front
push_front:能够进行链表的头部位置数据插入
pop_front:能够进行链表的头部位置数据删除
例子:
int main()
{list<int> lt;lt.push_front(1);lt.push_front(2);lt.push_front(3);for (auto e : lt){cout << e << " ";}cout << endl; //3 2 1lt.pop_front();for (auto e : lt){cout << e << " ";}cout << endl; //2 1return 0;
}
2.push_back和pop_back
push_back:能够进行链表的尾部位置数据插入
pop_back:能够进行链表的尾部位置数据删除
例子:
int main()
{list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);for (auto e : lt){cout << e << " ";}cout << endl; //1 2 3lt.pop_back();for (auto e : lt){cout << e << " ";}cout << endl;//1 2return 0;
}
3.insert
insert支持三种插入方式
1、在指定迭代器位置插入一个数。
2、在指定迭代器位置插入n个值为val的数。
3、在指定迭代器位置插入一段迭代器区间(注意左闭右开)。
例子:
int main()
{list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);list<int>::iterator pos = find(lt.begin(), lt.end(), 2);// 第一种插入方式lt.insert(pos, 4); //在2的位置插入4for (auto e : lt){cout << e << " ";}cout << endl; //1 4 2 3pos = find(lt.begin(), lt.end(), 4);// 第二种插入方式lt.insert(pos, 3, 5); //在pos(4)的位置插入3个3for (auto e : lt){cout << e << " ";}cout << endl; //1 5 5 5 4 2 3vector<int> v(3, 8);pos = find(lt.begin(), lt.end(), 2);// 第三种插入方式lt.insert(pos, v.begin(), v.end()); //在2的位置插入3个8for (auto e : lt){cout << e << " ";}cout << endl; //1 5 5 5 4 8 8 8 2 3return 0;
}
注意: find函数不是list中的成员函数,是头文件< algorithm >
中的一个函数,该函数在指定迭代器区间寻找指定元素的位置,并返回该位置的迭代器
4.erase
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(), 3);// 第一种删除方式lt.erase(pos); //删除3for (auto e : lt){cout << e << " ";}cout << endl; //1 2 4 5pos = find(lt.begin(), lt.end(), 2);// 第二种删除方式lt.erase(pos, lt.end()); //删除2及其之后的元素for (auto e : lt){cout << e << " ";}cout << endl; //1return 0;
}
迭代器的使用
1.begin和end
begin:能够得到容器中第一个元素的正向迭代器
end:能够得到容器中最后一个元素的后一个位置的正向迭代器
例子:
int main()
{list<int> lt(5, 2);// 正向迭代器遍历容器list<int>::iterator it = lt.begin();while (it != lt.end()){cout << *it << " ";it++;}cout << endl; return 0;
}
2.rbegin和rend
rbegin:能够得到容器中最后一个元素的反向迭代器
rend:能够得到容器中第一个元素的前一个位置的反向迭代器
例子:
int main()
{list<int> lt(5, 2);//反向迭代器遍历容器list<int>::reverse_iterator rit = lt.rbegin();while (rit != lt.rend()){cout << *rit << " ";rit++;}cout << endl;return 0;
}
获取元素
front和back
front:能够获取list容器中的第一个元素
back:能够获取list容器中的最后一个元素
例子:
int main()
{list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);cout << lt.front() << endl; //1cout << lt.back() << endl; //3return 0;
}
容器中元素个数和容量的控制
1.size
能够获取当前容器当中的数据个数
例子:
int main()
{list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);cout << lt.size() << endl; //3return 0;
}
2.resize
resize的使用规则:
1、当所给值大于当前的size时,将size扩大到该值,扩大的数据为第二个所给值,若未给出,则默认为容器所存储类型的默认构造函数所构造出来的值进行填充。
2、当所给值小于当前的size时,将size缩小到该值。
例子:
int main()
{list<int> lt(5, 2);for (auto e : lt){cout << e << " ";}cout << endl; //2 2 2 2 2lt.resize(8, 3); //将size扩大为8,扩大的填充的值为3for (auto e : lt){cout << e << " ";}cout << endl; //2 2 2 2 2 3 3 3lt.resize(3); //将size缩小为3for (auto e : lt){cout << e << " ";}cout << endl; //2 2 2return 0;
}
3.empty
能够用于判断容器是否为空
例子:
int main()
{list<int> lt;cout << lt.empty() << endl; // true 为空return 0;
}
4.clear
能够用于清空容器
例子:
int main()
{list<int> lt(5, 2);cout << lt.size() << endl; //5lt.clear(); //清空容器cout << lt.size() << endl; //0return 0;
}
其它操作函数
1.sort
能够用于将容器中的数据进行排序。
默认排序顺序为升序
例子:
int main()
{list<int> lt;lt.push_back(2);lt.push_back(9);lt.push_back(4);lt.push_back(0);lt.push_back(6);lt.push_back(7);lt.push_back(3);for (auto e : lt){cout << e << " ";}cout << endl; // 2 9 4 0 6 7 3lt.sort(); //默认将容器内数据排为升序for (auto e : lt){cout << e << " ";}cout << endl; //0 2 3 4 6 7 9return 0;
}
注意: 如果要进行降序排序,就需要自己实现比较函数
2.splice
能够用于两个list容器之间的拼接
有三种拼接方式:
1、将整个容器拼接到另一个容器的指定迭代器位置。
2、将容器当中的某一个数据拼接到另一个容器的指定迭代器位置。
3.将容器指定迭代器区间的数据拼接到另一个容器的指定迭代器位置。
例子:
int main()
{list<int> lt1(3, 2);list<int> lt2(3, 3);// 第一种拼接方式lt1.splice(lt1.begin(), lt2); //将容器lt2拼接到容器lt1的开头for (auto e : lt1){cout << e << " ";}cout << endl; //2 2 2 3 3 3list<int> lt3(3, 2);list<int> lt4(3, 3);// 第二种拼接方式lt3.splice(lt3.begin(), lt4, lt4.begin()); //将容器lt4的第一个数据拼接到容器lt3的开头for (auto e : lt3){cout << e << " ";}cout << endl; //3 2 2 2list<int> lt5(3, 2);list<int> lt6(3, 3);// 第三种拼接方式lt5.splice(lt5.begin(), lt6, lt6.begin(), lt6.end()); //将容器lt6的指定迭代器区间内的数据拼接到容器lt5的开头for (auto e : lt5){cout << e << " ";}cout << endl; //3 3 3 2 2 2return 0;
}
注意: 当一个容器中的数据被拼接到另一个容器中后,数据在原容器中就不存在了。所以拼接即是将该节点拼接到另一个容器中。
3.remove
能够删除容器中特定值的节点
例子:
int main()
{list<int> lt;lt.push_back(1);lt.push_back(3);lt.push_back(2);lt.push_back(2);lt.push_back(3);for (auto e : lt){cout << e << " ";}cout << endl; //1 3 2 2 3lt.remove(2); //删除容器当中值为2的节点for (auto e : lt){cout << e << " ";}cout << endl; //1 3 3return 0;
}
4.remove_if
能够删除容器中满足条件的节点
例子:
bool digit(const int& val)
{return val > 10;
}
int main()
{list<int> lt;lt.push_back(12);lt.push_back(3);lt.push_back(6);lt.push_back(19);lt.push_back(1);lt.push_back(5);for (auto e : lt){cout << e << " ";}cout << endl; //12 3 6 19 1 5// 删除条件lt.remove_if(digit); //删除容器当中值大于10的元素for (auto e : lt){cout << e << " ";}cout << endl; //3 6 1 5return 0;
}
5.unique
能够删除容器中连续的重复函数
例子:
int main()
{list<int> lt;lt.push_back(1);lt.push_back(5);lt.push_back(2);lt.push_back(3);lt.push_back(2);for (auto e : lt){cout << e << " ";}cout << endl; //1 5 2 3 2lt.sort(); //将容器当中的元素排为升序 1 2 2 3 5lt.unique(); //删除容器当中连续的重复元素for (auto e : lt){cout << e << " ";}cout << endl; //1 3 5return 0;
}
注意: 如果希望通过unique实现去重,需要对容器中的元素进行排序,因为unique是对连续的重复的节点去重,所以前提是连续。
6.merge
能够将一个有序的list容器合并到另一个有序的容器中,使合并之后的list容器仍然有序。即类似于归并排序
例子:
int main()
{list<int> lt1;lt1.push_back(3);lt1.push_back(5);lt1.push_back(2);list<int> lt2;lt2.push_back(4);lt2.push_back(1);lt2.push_back(6);lt1.sort(); //将容器lt1排为升序 2 3 5lt2.sort(); //将容器lt2排为升序 1 4 6lt1.merge(lt2); //将lt2合并到lt1当中for (auto e : lt1){cout << e << " ";}cout << endl; //1 2 3 4 5 6return 0;
}
7.reverse
能够将容器中的节点顺序进行逆置
例子:
int main()
{list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.reverse(); //将容器当中元素的位置进行逆置for (auto e : lt){cout << e << " ";}cout << endl; //3 2 1 return 0;
}
8.assign
能够用于将新内容分配给容器,替换当前内容
新内容的两种替换方式:
1.将n个值为val的数据分配给容器
2.将所给迭代器区间当中的内容分配给容器。
例子:
int main()
{list<char> lt(3, 'a');// 方式一lt.assign(3, 'b'); //将新内容分配给容器,替换其当前内容for (auto e : lt){cout << e << " ";}cout << endl; //b b bstring s("hello world");// 方式二lt.assign(s.begin(), s.end()); //将新内容分配给容器,替换其当前内容for (auto e : lt){cout << e << " ";}cout << endl; //h e l l o w o r l dreturn 0;
}
9.swap
能够将两个容器的内容进行交换
例子:
int main()
{list<int> lt1(3, 1);list<int> lt2(2, 4);lt1.swap(lt2); //交换两个容器的内容for (auto e : lt1){cout << e << " ";}cout << endl; //4 4for (auto e : lt2){cout << e << " ";}cout << endl; //1 1 1return 0;
}
相关文章:
C++ stl中的list的相关函数用法
文章目录 list的介绍list的使用定义方式 插入和删除迭代器的使用获取元素容器中元素个数和容量的控制其它操作函数 list的使用,首先要包含头文件 #include <list>list的介绍 1.list是一种可以在常数范围内在链表中的任意位置进行插入和删除的序列式容器&…...

【网络编程】七、详解HTTP 搭建HTTP服务器
文章目录 Ⅰ. HTTP协议的由来 -- 万维网Ⅱ. 认识URL1、URL的格式协议方案名登录信息 -- 忽略服务器地址服务器端口号文件路径查询字符串片段标识符 2、URL的编码和解码 Ⅲ. HTTP的报文结构1、请求协议格式2、响应协议格式🎏 写代码的时候,怎么保证请求和…...

[Java实战]Spring Boot 快速配置 HTTPS 并实现 HTTP 自动跳转(八)
[Java实战]Spring Boot 快速配置 HTTPS 并实现 HTTP 自动跳转(八) 引言 在当今网络安全威胁日益严峻的背景下,为 Web 应用启用 HTTPS 已成为基本要求。Spring Boot 提供了简单高效的方式集成 HTTPS 支持,无论是开发环境测试还是生产环境部署࿰…...
Spring Boot 中的重试机制
Retryable 注解简介 Retryable 注解是 Spring Retry 模块提供的,用于自动重试可能会失败的方法。在微服务架构和分布式系统中,服务之间的调用可能会因为网络问题、服务繁忙等原因失败。使用 Retryable 可以提高应用的稳定性和容错能力 1。 使用步骤 &…...
【React中useRef钩子详解】
一、useRef的核心特性 useRef是React提供的Hook,用于在函数组件中创建可变的持久化引用,具有以下核心特性: 持久化存储 返回的ref对象在组件整个生命周期内保持不变,即使组件重新渲染,current属性的值也不会丢失。无触发渲染 修改ref.current的值不会导致组件重新渲染,适…...
golang-ErrGroup用法以及源码解读笔记
介绍 ErrGroup可以并发执行多个goroutine,并可以很方便的处理错误 与sync.WaitGroup相比 错误处理 sync.WaitGroup只负责等待goroutine执行完成,而不处理返回值或者错误errgroup.Group目前虽然不能直接处理函数的返回值或错误。但是当goroutine返回错…...
17.【.NET 8 实战--孢子记账--从单体到微服务--转向微服务】--微服务基础工具与技术--loki
在微服务中,日志是非常重要的组成部分。它不仅可以帮助我们排查问题,还可以帮助我们分析系统的性能和使用情况。 一、loki简介 loki是一个开源的日志聚合系统,它可以帮助我们高效地收集、存储和分析日志数据。loki的设计理念是“简单、快速…...

CVPR计算机视觉顶会论文解读:IPC-Dehaze 如何解决真实场景去雾难题
【CVPR 2025】迭代预测-评判编解码网络:突破真实场景去雾的极限 摘要 本文提出了一种名为IPC-Dehaze的创新去雾方法,通过迭代预测-评判框架和码本解码机制,有效解决了现有去雾算法在复杂场景下的性能瓶颈。该方法在多个基准测试中取得了SOT…...

ppy/osu构建 ipad作为osu按键xz笔记2 deepwiki websokect
ipad当x和z键玩osu #无声打osu#没磁轴怎么打osu 下载 .NET (Linux、macOS 和 Windows) | .NET dotnet还行 构建:f5 运行:dotnet run --project osu.Desktop -c Debug deepwiki就是nb uinput是ubuntu的我现在没法调试,放着 import asyn…...
scons user 3.1.2
前言 感谢您抽出时间阅读有关 SCons 的内容。SCons 是一款下一代软件构建工具,或者称为 make 工具,即一种用于构建软件(或其他文件)并在底层输入文件发生更改时使已构建的软件保持最新状态的软件实用程序。 SCons 最显著的特点是…...
大语言模型主流架构解析:从 Transformer 到 GPT、BERT
📌 友情提示: 本文内容由银河易创AI(https://ai.eaigx.com)创作平台的gpt-4-turbo模型生成,旨在提供技术参考与灵感启发。文中观点或代码示例需结合实际情况验证,建议读者通过官方文档或实践进一步确认其准…...

.NET程序启动就报错,如何截获初期化时的问题json
一:背景 1. 讲故事 前几天训练营里的一位朋友在复习课件的时候,程序一跑就报错,截图如下: 从给出的错误信息看大概是因为json格式无效导致的,在早期的训练营里曾经也有一例这样的报错,最后定位下来是公司…...

nacos:服务注册原理
目录 NaCos服务注册原理1、AbstractAutoServiceRegistration功能和作用onApplicationEvent()方法start()方法 2、NacosAutoServiceRegistration功能和作用NacosAutoServiceRegistration.register()方法AbstractAutoServiceRegistration.register()方法 3、NacosServiceRegistry…...

基于开源AI大模型与S2B2C生态的个人品牌优势挖掘与标签重构研究
摘要:在数字文明时代,个人品牌塑造已从传统经验驱动转向数据智能驱动。本文以开源AI大模型、AI智能名片与S2B2C商城小程序源码为技术载体,提出"社会评价-数据验证-标签重构"的三维分析框架。通过实证研究发现,结合第三方…...
《React Native与Flutter:社交应用中用户行为分析与埋点统计的深度剖析》
React Native与Flutter作为两款备受瞩目的跨平台开发框架,正深刻地影响着应用的构建方式。当聚焦于用户行为分析与埋点统计时,它们各自展现出独特的策略与工具选择,这些差异和共性不仅关乎开发效率,更与社交应用能否精准把握用户需…...

polarctf-web-[简单rce]
考点: (1)RCE(eval函数) (2)执行函数(passthru函数) (3)/顶级(根)目录查看 (4)sort排序查看函数 题目来源:Polarctf-web-[简单rce] 解题: 代码审计 <?php/*PolarD&N CTF*/highlight_file(__FILE__);function no($txt){ # …...

深入理解 Cortex-M3 特殊寄存器
在上一篇文章中分享了 Cortex-M3 内核寄存器组的相关知识,实际上除了内核寄存器组外,CM3 处理器中还存在多个特殊寄存器,它们分别为 程序状态寄存器,中断/异常屏蔽寄存器 和 控制寄存器。 需要注意的是,特殊寄存器未经…...

[Java实战]Spring Boot 3 整合 Ehcache 3(十九)
[Java实战]Spring Boot 3 整合 Ehcache 3(十九) 引言 在微服务和高并发场景下,缓存是提升系统性能的关键技术之一。Ehcache 作为 Java 生态中成熟的内存缓存框架,其 3.x 版本在性能、功能和易用性上均有显著提升。本文将详细介绍…...

建筑物渗水漏水痕迹发霉潮湿分割数据集labelme格式1357张1类别
数据集中有增强图片详情看图片 数据集格式:labelme格式(不包含mask文件,仅仅包含jpg图片和对应的json文件) 图片数量(jpg文件个数):1357 标注数量(json文件个数):1357 标注类别数:1 标注类别名称:["water&qu…...
Doris和Clickhouse对比
目录 一、Doris和Clickhouse对比1. 底层架构**DorisClickHouse** 2. 运行原理DorisClickHouse 3. 使用场景DorisClickHouse 4. 优缺点对比总结 二、MPP架构和Shared-Nothing 架构对比1. 什么是 MPP 架构?定义特点典型代表 2. 什么是 Shared-Nothing 架构?…...

第二十二天打卡
数据预处理 import pandas as pd from sklearn.model_selection import train_test_splitdef data_preprocessing(file_path):"""泰坦尼克号生存预测数据预处理函数参数:file_path: 原始数据文件路径返回:preprocessed_data: 预处理后的数据集""&quo…...
Android Activity之间跳转的原理
一、Activity跳转核心流程 Android Activity跳转的底层实现涉及 系统服务交互、进程间通信(IPC) 和 生命周期管理,主要流程如下: startActivity() 触发请求 应用调用 startActivity() 时,通过 Inst…...
MATLAB 矩阵与数组操作基础教程
文章目录 前言环境配置一、创建矩阵与数组(一)直接输入法(二)特殊矩阵生成函数(三)使用冒号表达式创建数组 二、矩阵与数组的基本操作(一)访问元素(二)修改元…...
【Linux】第十六章 分析和存储日志
1. RHEL 日志文件保存在哪个目录中? 一般存储在 /var/log 目录中。 2. 什么是syslog消息和非syslog消息? syslog消息是一种标准的日志记录协议和格式,用于系统和应用程序记录日志信息。它规定了日志消息的结构和内容,包括消息的…...

解锁性能密码:Linux 环境下 Oracle 大页配置全攻略
在 Oracle 数据库运行过程中,内存管理是影响其性能的关键因素之一。大页内存(Large Pages)作为一种优化内存使用的技术,能够显著提升 Oracle 数据库的运行效率。本文将深入介绍大页内存的相关概念,并详细阐述 Oracle 在…...

Spark,在shell中运行RDD程序
在hdfs中/wcinput中创建一个文件:word2.txt在里面写几个单词 启动hdfs集群 [roothadoop100 ~]# myhadoop start [roothadoop100 ~]# cd /opt/module/spark-yarn/bin [roothadoop100 ~]# ./spark-shell 写个11测试一下 按住ctrlD退出 进入环境:spa…...

SAP学习笔记 - 开发11 - RAP(RESTful Application Programming)简介
上一章学习了BTP架构图,实操创建Directory/Subaccount,BTP的内部组成,BTP Cockpit。 SAP学习笔记 - 开发10 - BTP架构图,实操创建Directory/Subaccount,BTP的内部组成,BTP Cockpit-CSDN博客 本章继续学习S…...

数据防泄密安全:企业稳健发展的守护盾
在数字化时代,数据已成为企业最核心的资产之一。无论是客户信息、财务数据,还是商业机密,一旦泄露,都可能给企业带来不可估量的损失。近年来,数据泄露事件频发,如Facebook用户数据泄露、Equifax信用数据外泄…...

MySQL之基础索引
目录 引言 1、创建索引 2、索引的原理 2、索引的类型 3、索引的使用 1.添加索引 2.删除索引 3.删除主键索引 4.修改索引 5.查询索引 引言 当一个数据库里面的数据特别多,比如800万,光是创建插入数据就要十几分钟,我们查询一条信息也…...
Openshift节点Disk pressure
OpenShift 监控以下指标,并定义以下垃圾回收的驱逐阈值。请参阅产品文档以更改任何驱逐值。 nodefs.available 从 cadvisor 来看,该node.stats.fs.available指标表示节点文件系统(所在位置)上有多少可用(剩余…...