C++STL详解(五)——list的介绍与使用
文章目录
- list的介绍
- list的使用
- list的定义方法
- list迭代器失效问题
- list插入和删除
- insert
- erase
- list迭代器的使用
- begin,end 和 rbegin,rend
- list元素访问
- front 和 back
- list容量控制与数据清理
- resize
- clear
- list操作函数
- splice
- remove 和 remove_if
- unique
- merge
- reverse
- assign
list的介绍
1:list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。
2:与其他序列容器相比(array,vector,deque),list通常可以在任意位置进行插入,移除等效率更高。
3:与其他序列式容器相比,list和forward_list最大的缺陷就是不支持任意位置的访问,比如:要访问list的第6个元素,必须从已知的位置的位置迭代到目标位置,然而,迭代的时间复杂度通常为线性开销,list还需要一些额外的空间,来保存每个结点的相关联信息(对于存储类型较小的list来说)。
list的使用
list的定义方法
方法一:
list<int> lt;
方法二:
构造1个2类型为list 容器。
list<int> lt1(1,2);
方法三:
拷贝构造类型为list 的lt1。
list<int> lt2( lt1);
方法四:
利用迭代器区间进行构造。
string s("hello c++");
list<char>lt3(s.begin(),s.end());
方法五:
也是迭代器区间构造的一种形式,区间为左闭右开。
int arr[] = { 1,2,3,4,5 };int sz = sizeof(arr) / sizeof(int);list<int> lt1(arr, arr + 2);
list迭代器失效问题
void Test1()
{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()){// erase()函数执行后,it所指向的节点已被删除,因此it无效,在下一次使用it时,必须先给
其赋值l.erase(it); ++it;}
}
list插入和删除
insert
三种插入方式:
方式1:
在指定位置前插入一个数。
方式2:
在指定位置插入n个数。
方式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(),3 );lt.insert(pos, 0); for (auto e : lt){cout << e << " ";}cout << endl; pos = find(lt.begin(), lt.end(), 3);lt.insert(pos, 2, 1); //for (auto e : lt){cout << e << " ";}cout << endl; vector<int> v(3, 8);pos = find(lt.begin(), lt.end(), 1);lt.insert(pos, v.begin(), v.end());for (auto e : lt){cout << e << " ";}cout << endl; }
erase
三种删除方式:
方式1:
指定目标位置进行删除。
方式2:
指定迭代器区间进行删除。
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);lt.push_back(6);auto pos = find(lt.begin(), lt.end(), 2);lt.erase(pos); //删除2位置的结点。for (auto e : lt){cout << e << " ";}cout << endl; pos = find(lt.begin(), lt.end(), 3);lt.erase(pos, lt.end()); //给定迭代器区间删除3后面的结点。for (auto e : lt){cout << e << " ";}cout << endl; return 0;
}
list迭代器的使用

正向迭代器和反向迭代器的位置是对称的,指向的位置相反。
begin,end 和 rbegin,rend
int main()
{list<int> lt{ 1,2,3,4,5 };//正向迭代器遍历容器auto it = lt.begin();while (it != lt.end()){cout << *it << " ";it++;}cout << endl;auto rit = lt.rbegin();while( rit != lt.rend() ){cout << *rit << " ";rit++;}return 0;}
list元素访问
由于list和forward_lsit一样都不能随机访问,STL中具有获取list首尾元素功能。
front 和 back
int main()
{list<int> lt;lt.push_back(0);lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);lt.push_back(5);lt.push_back(6);cout << lt.front() << endl; //获取list首元素cout << lt.back() << endl; //获取list尾元素return 0;
}
list容量控制与数据清理
resize
1: 如果所给的第一个值大于lsit当前的size,如果给了第二个值,那么多出的size的值就为第二个所给值,如果没给,编译器就主动调用缺省值(一般为0)。
2:如果所给的值小于list当前的size,则lsit当前的size就为这个所给值
int main()
{list<int> lt{ 1,2,23 };for (auto e : lt){cout << e << " ";}lt.resize(7, 6); //多出的size初始值都为6;cout << endl;for (auto e : lt){cout << e << " ";}lt.resize(1); //list当前只剩下一个size;cout << endl;for (auto e : lt){cout << e << " ";}
}
clear
clear用于清空list容器,此时list的size为0;
int main()
{list<int> lt(3, 2);for (auto e : lt){cout << e << " ";}cout << endl; cout << lt.size() << endl; lt.clear(); for (auto e : lt){cout << e << " ";}cout << endl;return 0;
}
list操作函数
splice
list中splice函数用于两个list容器之间的拼接,有三种常见拼接方法。
1: 将指定容器全部数据拼接到指定位置。
2: 将指定容器的某个数据拼接到目标容器的指定位置。
3: 将指定容器的某个迭代器区间(左闭右开)数据拼接到目标容器中。
int main()
{list<int> lt1(1, 1);list<int> lt2(1, 2);//将lt2拼接到lt1首部。lt1.splice(lt1.begin(), lt2); for (auto& e : lt1){cout << e << " ";}cout << endl; list<int> lt3(1, 3);list<int> lt4(1, 4);//将lt4容器中首位置拼接到目标容器lt3的尾部。lt3.splice(lt3.end(), lt4, lt4.begin()); for(auto&e : lt3){cout << e << " ";}cout << endl;list<int> lt5(1, 5);list<int> lt6(1, 6);//将指定容器lt6的指定迭代器区间内的数据拼接到目标容器lt5的首部lt5.splice(lt5.begin(), lt6, lt6.begin(), lt6.end()); for (auto& e : lt5){cout << e << " ";}cout << endl;return 0;
}
remove 和 remove_if
remove:
删除容器容器中指定的数据。(包括重复项)
remove_if
删除容器当中符合条件的数据。
bool test(const int& val)
{//删除中容器小于3的数。return val < 3;}
int main()
{list<int> lt1{ 1,2,3,4,5 };lt1.remove_if(test); for (auto& e : lt1){cout << e << " ";}list<int> lt2{ 1,2,3,4,5,6 };//删除list容器中指定元素。lt2.remove(3); for (auto& e : lt2){cout << e << " ";}}
unique
删除容器中连续的重复元素。
注意:
在使用unique去重之前最好先让list排序。
int main()
{list<int> lt1{ 3,1,1,2,3,3,4,5 };//在使用unique之前最好先使用sort排序一下。lt1.sort();lt1.unique();for (auto& e : lt1){cout << e << " ";}
}
merge
将指定容器合并到目标容器中,并且合并过后的容器lt1依然为升序(类似于归并排序)
int main()
{list<int> lt1{ 3,1,1,2,3,3,4,5 };//在使用unique之前最好先使用sort排序一下。list<int> lt2{ 6,7,8 };lt1.sort();//将lt2有序容器合并到lt1中。lt1.merge(lt2);for (auto& e : lt1){cout << e << " ";}
}
reverse
将容器中所有数据的位置进行逆置。
int main()
{list<int> lt1{ 1,2,3 };lt1.reverse();for (auto& e : lt1){cout << e << " ";}
}
assign
1:将指定个数指定内容的分配给容器(覆盖分配);
2:利用迭代器,将存储相同数据类型的容器,指定迭代器区间进行分配。
int main()
{list<int> lt1{ 1,2,3 };lt1.assign(3, 1);for (auto& e : lt1){cout << e << " ";}string s("hello C++");list<char>lt2;lt2.assign(s.begin(), s.end());for (auto& e : lt2){cout << e << " ";}
}
相关文章:
C++STL详解(五)——list的介绍与使用
文章目录list的介绍list的使用list的定义方法list迭代器失效问题list插入和删除inserteraselist迭代器的使用begin,end 和 rbegin,rendlist元素访问front 和 backlist容量控制与数据清理resizeclearlist操作函数spliceremove 和 remove_ifuniquemergerev…...
进程和进程的调度
今天,为大家带来进程和进程的调度的学习 1.认识计算机 2.什么是操作系统 3.什么是进程 4.进程管理 5.进程的属性 6.进程的调度 7.进程调度的过程 8.内存分配 1.认识计算机 计算机的组成有五大部分 1.CPU(是计算机的大脑,负责逻辑运算和控制) 2.内存 3.外存 4.输入…...
TypeScript 深度剖析:TypeScript 的理解?与 JavaScript 的区别?
一、是什么 TypeScript 是 JavaScript 的类型的超集,支持ES6语法,支持面向对象编程的概念,如类、接口、继承、泛型等 超集,不得不说另外一个概念,子集,怎么理解这两个呢,举个例子,如…...
美颜SDK关键技术讲解——人脸识别与人脸美化
拍摄,自从智能手机普及之后就已经不再是小众爱好,使用手机拍摄记录生活几乎成了人们的日常。在巨量的需求下,美颜工具、美颜SDK已经被广泛应用于各大视频拍摄平台。虽然经常听到美颜SDK,但是大多数人并不了解它,下文小…...
Linux下C/C++ 网络扫描(主机扫描技术)
主机扫描是网络扫描的基础,通过对目标网络中主机IP地址的扫描,从一堆主机中扫描出存活的主机,然后以他们为目标进行后续的攻击。一般会借助于ICMP、TCP、UDP等协议的工作机制,检查打开的进程,开放的端口号等等。 主机…...
无法将“vue-cli-service”项识别为 cmdlet、函数、脚本文件或不是内部命令的原因和解决方案
经常有小伙伴问我说,为什么我们在开发vue项目的时候,需要在package.json的script对象中,去设置命令启动项目,而不是直接的通过"vue-cli-service serve"命令去把项目跑起来。带着这些疑问,小生在此总结了以下…...
逆流程 场景下 处理状态机变化的方案
背景: 针对某些业务场景下,存在逆流程。 比如场景的场景 正向流程如,发起某项申请->对某项申请进行审批。(审批为通过/驳回)。这样这个工作流程就算到最终态。 常见的状态机如, 申请未提交࿰…...
【剧前爆米花--爪哇岛寻宝】Java实现无头单向非循环链表和无头双向链表与相关题目
作者:困了电视剧 专栏:《数据结构--Java》 文章分布:这是关于数据结构链表的文章,包含了自己的无头单向非循环链表和无头双向链表实现简单实现,和相关题目,想对你有所帮助。 目录 无头单向非循环链表实现 …...
学习MvvmLight工具
最近学习了一下MvvmLight,觉得有些功能还是挺有特色的,所以记录一下 首先新建也给WPF程序 然后在Nuget里面安装MvvmLightLib 包,安装上面那个也可以,但是安装上面那个会自动在代码里面添加一些MvvmLight的demo ,安装M…...
基于BiLSTM+CRF医学病例命名实体识别项目
研究背景 为通过项目实战增加对命名实体识别的认识,本文找到中科院软件所刘焕勇老师在github上的开源项目,中文电子病例命名实体识别项目MedicalNamedEntityRecognition。对其进行详细解读。 原项目地址:https://github.com/liuhuanyong/Med…...
05 C语言数据类型
05 C语言数据类型 1、数据类型 编程语言对数据类型分为两派:一种认为要注重,一种认为可以忽视。 C语言类型 1、整数 : char < short < int < long < long long ,bool 2、浮点数:float < double < long doub…...
C++11:右值引用和移动语义
文章目录1. 左值和右值表达式1.1 概念1.2 左值和右值2. 左值引用和右值引用2.1 相互引用2.2 示例代码2.3 左值引用使用场景缺点2.4 右值引用和移动语义小结2.5 移动赋值2.6 右值引用的其他使用场景右值引用版本的插入函数3. 完美转发3.1 万能引用3.2 如何实现完美转发3.3 完美转…...
tcpdump网络抓包工具
tcpdump 是一个强大的网络抓包工具,在分析服务之间调用时非常有用。可以将网络中传送的数据包抓取下来进行分析。tcpdump 提供灵活的抓取策略,支持针对网络层、协议、主机、网络或端口的过滤,并提供 and、or、not 等逻辑语句来去掉不想要的信…...
MaxCompute SQL中的所有保留字与关键字如下
– MaxCompute SQL中的所有保留字与关键字如下 注意 命名表、列或分区时,不要使用保留字与关键字,否则可能会报错。 保留字不区分大小写。 在对表、列或是分区命名时如若使用关键字,需给关键字加符号进行转义,否则会报错。 % &am…...
Kafka 压缩算法
压缩 (compression) : 用时间换空间的思想 用较小的 CPU 开销获得磁盘少占用或网络 I/O 少传输 Kafka 消息分两层: 消息日志组成 : n 个消息集合消息集合 (message set) 组成 : n 条日志项 (record item)日志项封装了消息 (message)Kafka 在消息集合层上进行写入…...
关于React Hook(18)
useState():👉详情 (必须“有条件地调用”;注意避免冗余状态的产生) 关于useState的两种使用方式的区别:👉详情 关于batch机制:有条件地调用一些状态的set方…...
计算机网络:BGP协议
BGP协议 与其他AS的邻站BPG发言人交换信息。 交换的网络可达性信息,即要到达某一个网络所要经历的一系列AS 发生变化时,更新有变化的部分 BGP协议交换信息的过程:所交换的网络可达性信息就是要到达某一个网络所要经历的一系列ASÿ…...
91. 解码方法 ——【Leetcode每日刷题】
91. 解码方法 一条包含字母 A-Z 的消息通过以下映射进行了 编码 : ‘A’ -> “1” ‘B’ -> “2” … ‘Z’ -> “26” 要 解码 已编码的消息,所有数字必须基于上述映射的方法,反向映射回字母(可能有多种方法࿰…...
人体存在传感器成品方案,精准感知静止存在,实时智能化感控技术
随着现今智能时代的发展,酒店也越来越趋于智能化,也在不断地推行智慧酒店,这也给人们入住酒店提供了良好的体验。 人体存在感知是智能酒店中极其重要的一项应用技术,只有智能设备通过精准地感知人体存在,才能更好地做…...
mysql连接池的实现
目录 1 池化技术 2 什么是数据库连接池 3 为什么使用数据库连接池 3.1 不使用连接池 3.2 使用连接池 3.3 长连接和连接池的区别 4 数据库连接池运行机制 5 连接池和线程池的关系 6 线程池设计要点 6.1 连接池设计逻辑 构造函数 初始化 请求获取连接 归还连接 析…...
AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...
MySQL:分区的基本使用
目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区(Partitioning)是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分(分区)可以独立存储、管理和优化,…...
水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关
在水泥厂的生产流程中,工业自动化网关起着至关重要的作用,尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关,为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多,其中不少设备采用Devicenet协议。Devicen…...
Ubuntu系统多网卡多相机IP设置方法
目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机,交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息,系统版本:Ubuntu22.04.5 LTS;内核版本…...
6️⃣Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙
Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙 一、前言:离区块链还有多远? 区块链听起来可能遥不可及,似乎是只有密码学专家和资深工程师才能涉足的领域。但事实上,构建一个区块链的核心并不复杂,尤其当你已经掌握了一门系统编程语言,比如 Go。 要真正理解区…...
