【C++】容器list常用接口详解

news2024/12/23 20:40:55

目录

一.基本介绍

二.list的使用

1.构造函数

2.迭代器

3.遍历方式

4.容量相关操作

5.增删改查

三.list迭代器失效问题

四.算法库函数和list关系


一.基本介绍

  1. list是一个带头双向循环链表
  2. 由于是链表,物理空间不连续,不支持随机访问数据,因此和vector相比,少了[]访问和resize、reserve等容量相关的函数
  3. 与其他序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率更好

二.list的使用

1.构造函数

构造函数功能说明
list(size_type n, const value_type& val = value_type())构造一个包含n个val元素的列表
list()构造一个空列表
list(const list& x)拷贝构造函数,构造一个包含x中每个元素的列表
list(InputIterator first, InputIterator last)用区间 [ first , last ) 中的元素构造的一个列表
list<int> l1;//无参构造
list<int> l2(10, 1);//用10个1初始化链表

vector<int> v{ 1,2,3,4,5 };
list<int> l3(v.begin(), v.end());//用迭代器区间初始化

2.迭代器

list不支持随机访问, 其底层就不是指针了,但迭代器的底层我们并不关心,只需要将其视为指针使用就行。

 这四个函数都是老朋友了,不多介绍了,但是在带头双向循环链表中,它的位置值得注意不妨用这个代码测试一下:

 当然也有begin()就是rend(),end()是rbegin()这种,这个在后续实现反向迭代器的时候再谈。 

3.遍历方式

迭代器遍历

vector<int> v{ 1,2,3,4,5,6,7,8 };
list<int> l(v.begin(), v.end());
//list<int> l{ 1,2,3,4,5,6,7,8 };

auto it = l.begin();
while (it != l.end())
{
	cout << *it << " ";
	++it;
}
cout << endl;

 范围for遍历

vector<int> v{ 1,2,3,4,5,6,7,8 };
list<int> l(v.begin(), v.end());
//list<int> l{ 1,2,3,4,5,6,7,8 };

for (auto e : l)
{
	cout << e << " ";
}
cout << endl;

注意:list不支持随机访问,因此不能使用[ ] ,也就少了一种普通下标循环遍历 

4.容量相关操作

函数功能
empty检测列表是否为空。如果为空返回 true,否则返回 false。
size返回列表中元素的个数
函数功能
front返回list的第一个元素的引用。
back返回list的最后一个元素的引用。

5.增删改查

函数功能
push_front在list首元素前插入值为val的元素
pop_front删除list中第一个元素
push_back在list尾部插入值为val的元素
push_front删除list中最后一个元素
insert在list position 位置中插入值为val的元素
erase删除list position位置的元素
swap交换两个list中的元素
clear清空list中的有效元素

大致都和之前的string,vector差不多,不过由于list不像vector一样具有size和capacity,list的clear就是直接清空链表(除头结点外)

三.list迭代器失效问题

由于list底层是带头双向循环链表,因此在插入操作时,pos指向的始终是同一个位置,它们只改变链接关系,并不连续,因此插入操作并不会导致list迭代器失效

但在erase删除操作时list迭代器会失效。erase删除的位置在空间上是唯一的,这个位置的数据被删除后,只是改变了原有的链接关系,此位置已经不在原链表中了,再次使用就会出错 

STL库中的erase使用返回值来解决迭代器失效,返回被删除位置的下一个位置的迭代器 

list<int> l{ 1,2,3,4,5,6,7,8,9 };
auto it = l.begin();
while (it != l.end())
{
	if (*it % 2 == 0)
	{
		it = l.erase(it);
	}
	else
	{
		++it;
	}
}
for (auto e : l)
{
	cout << e << " ";
}
cout << endl;

 四.算法库函数和list关系

迭代器从功能角度可以分为三种:

  1. 正向迭代器:forward_iterator ,只支持++
  2. 双向迭代器:bidirectional_iterator ,支持++和--
  3. 随机迭代器:random_iterator ,支持++,--,+,-
常见的容器以及它们的迭代器类型
容器迭代器类型
vector随机迭代器
list双向迭代器
stack不支持迭代器
queue不支持迭代器
deque随机迭代器
set / multiset双向迭代器
map / multimap双向迭代器
priority_queue不支持迭代器

在算法库中常见的函数,例如sort,它的函数模板支持的就是随机迭代器,reverse支持双向迭代器

三类迭代器支持向上兼容,也就是说

  • 函数模板给的随机迭代器:只允许随机迭代器
  • 函数模板给的双向迭代器:允许随机和双向迭代器 
  • 函数模板给的单向迭代器:允许随机、双向和单向迭代器

可见list是双向迭代器,那么它就不能使用库里的sort函数(要求随机迭代器),因此list类自己实现了一个不同于算法库的排序,专门用来排序list的数据 虽然list有自己的sort函数来排序,但当数据很多时,效率低得惊人,因此有了另一种排序list的方法:先将list的数据导入vector容器,再在vector容器中使用算法库的sort排序,排完再导回list中


本文就到这里,下一章将对list进行模拟实战,欢迎持续关注

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

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

相关文章

《机器学习》周志华-CH6(支持向量机)

6.1间隔与支持向量 给定训练样本 D { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x m , y m ) } , y i ∈ { − 1 , 1 } D\{(x_1,y_1),(x_2,y_2),...,(x_m,y_m)\},y_i\in\{-1,1\} D{(x1​,y1​),(x2​,y2​),...,(xm​,ym​)},yi​∈{−1,1}分类学习最基本的想法是基于训练集…

SQL优化神器 SQLAdvisor

简介 SQLAdvisor是一款开源的SQL优化工具&#xff0c;由美团点评公司的技术工程部DBA团队开发与维护。作为一个分析SQL语句并提出索引优化建议的工具&#xff0c;它基于MySQL原生词法解析&#xff0c;结合SQL中的where条件、字段选择度、聚合条件、多表Join关系等&#xff0c;…

爆改YOLOv8|利用yolov10的C2fCIB改进yolov8-高效涨点

1&#xff0c;本文介绍 本文介绍了一种改进机制&#xff0c;通过引入 YOLOv10 的 C2fCIB 模块来提升 YOLOv8 的性能。C2fCIB 模块中的 CIB&#xff08;Compact Inverted Bottleneck&#xff09;结构采用了高效的深度卷积进行空间特征混合&#xff0c;并使用点卷积进行通道特征…

PLM系统在企业数字化转型中的关键作用 三品PLM在制造业转型实例分析

在当今数字化时代&#xff0c;企业面临着日益激烈的市场竞争和快速变化的客户需求。为了保持竞争力并实现可持续发展&#xff0c;企业纷纷进行数字化转型。而PLM产品生命周期管理系统作为数字化转型的关键组成部分&#xff0c;其在企业中的应用显得尤为重要。本文将探讨PLM系统…

AAA原理与配置

定义 AAA是Authentication&#xff08;认证&#xff09;、Authorization&#xff08;授权&#xff09;和Accounting&#xff08;计费&#xff09;的简称&#xff0c;是网络安全的一种管理机制&#xff0c;提供了认证、授权、计费三种安全功能。 这三种安全功能的具体作用如下…

Java如何计算一个数的阶乘末尾有多少个零?

文章有点长&#xff0c;请耐心看完~~~ 这个问题涉及到阶乘&#xff08;factorial&#xff09;的一个有趣特性&#xff0c;即阶乘结果末尾零的数量。要理解这一点&#xff0c;我们首先要知道什么情况下一个数的末尾会产生零。 什么情况下一个数的末尾会产生零 在十进制数制中…

代码随想录训练营day35|46. 携带研究材料,416. 分割等和子集

46. 携带研究材料 思路&#xff1a;用一个数组来记录&#xff1f;dp[i]带i件物品的最大价值 好吧&#xff0c;这里用的是一个二维数组dp[i][j]&#xff0c;表示从[0&#xff0c;i]的物间任选武平&#xff0c;能用容量为j的背包装下的最大价值 重量 价值 物品0 1 15 物品1 3 2…

AI绘画|Stable Diffusion高质量提示词收集(附提示词手册以及提示词插件)

使用平台:comfyui 模型:AlbedoBase-XL 图片尺寸:768x1280 提示词万字手册&#xff0c;可以扫描下方&#xff0c;免费获取 图1 提示词 an attractive rough cyborg woman with a serious look in her eyes, messy conceptual felt-tip pen (drawing:1.3) by (Yoji Shinkawa:…

“三年级英语”暴增5亿搜索量?需求来了!附2个极品AI吸粉玩法!

家人们&#xff01;在英语细分领域&#xff0c;一直都是付费知识中的风口黄金大赛道。 而这两天“英语”这个关键词&#xff0c;在微信指数上的日搜索量突然猛增到5个亿。 这两天全网热词“三年级英语”&#xff0c;日环比搜索指数更是486.2%增长率&#xff0c;一天时间内就增…

vsftpd的安装和配置

目录 vsftpd的下载与配置 下载vsftpd vsftpd的配置 测试服务的功能 vsftpd的下载与配置 下载vsftpd rpm -qc vsftpd&#xff0c;检查vsftpd安装包是否存在&#xff0c;存在则不需要安装。 yum install -y vsftpd&#xff0c;不存在则yum安装vsftpd。 安装成功 vsftpd的…

早上醒来嗓子干、喉咙痛、咳嗽……快用这个润养好物,给嗓子做个spa,让身体润起来~

进入秋季&#xff0c;很多人出现了眼睛干涩、大便干燥、嘴唇干裂、咽喉疼痛等症状&#xff0c;虽说这些还能够忍受&#xff0c;但它却影响了正常的饮食和休息。 秋季气候干燥&#xff0c;外界燥邪侵犯肺部&#xff0c;易伤津液&#xff0c;肺失滋润&#xff0c;清肃失司&#x…

宣布 Vue 3.5 版发布

宣布 Vue 3.5 版发布 今天我们很高兴地宣布 Vue 3.5 版“天元突破红莲螺岩”正式发布&#xff01; 这一小版本发布没有破坏性更改&#xff0c;包括内部改进和一些有用的新特性。我们将在这篇博客中介绍一些亮点 - 详细的更改和新特性请查阅 GitHub 上的完整变更日志。 响应式…

单片机上搭配的SPI NOR FLASH容量告急!扩容新选择

文章目录 前言&#xff1a;正文&#xff1a; 为便于理解并省去容量单位转换的麻烦&#xff0c;以下容量单位均使用Byte单位&#xff08;128Mbit16MByte&#xff09; 前言&#xff1a; NOR FLASH 是市场上两种主要的非易失闪存技术之一。Intel于1988年首先开发出NOR Flash 技术…

代码审计总结

代码审计总结 概述 一、代码审计 1.1什么是代码审计&#xff1f; 1.2为什么要执行代码审核&#xff1f; 1.3代码审计的好处 二、代码审计流程 2.1代码检查方法 2.2代码检查项目 2.3编码规范 2.4代码检查规范 2.5缺陷检查表 2.6代码审计复查 2.7代码审计结果总结 三…

由一个 SwiftData “诡异”运行时崩溃而引发的钩深索隐(一)

概述 从 WWDC 23 开始&#xff0c;苹果推出了全新的数据库框架 SwiftData。它借助于 Swift 语言简洁而富有表现力的特点&#xff0c;抛弃了以往数据库所有的额外配置文件&#xff0c;只靠纯代码描述就可以干脆利索的让数据库的创建和增删改查&#xff08;CRUD&#xff09;一气…

10分钟了解OPPO中间件容器化实践

背景 OPPO是一家全球化的科技公司&#xff0c;随着公司的快速发展&#xff0c;业务方向越来越多&#xff0c;对中间件的依赖也越来越紧密&#xff0c;中间件的集群的数量成倍数增长&#xff0c;在中间件的部署&#xff0c;使用&#xff0c;以及运维出现各种问题。 1.中间件与业…

CAD图纸防泄密有哪些方法?五个防泄密方法分享

CAD图纸作为工程设计的重要资料&#xff0c;其防泄密工作至关重要。以下将分享五个有效的CAD图纸防泄密方法&#xff0c;旨在确保图纸的安全性和机密性。 1. 使用CAD软件自带的加密功能 大多数CAD软件&#xff0c;如AutoCAD&#xff0c;都内置了加密功能。在保存CAD图纸时&am…

MySQL主从复制(Linux篇)

1.概述 MySQL的主从复制&#xff08;Master-Slave Replication&#xff09;是一种数据复制解决方案&#xff0c;将主数据库的DDL和DML操作通过二进制日志传到从库服务器中&#xff0c;然后在从库上对这些日志重新执行&#xff08;也叫重做&#xff09;&#xff0c;从而是的从库…

MES系统:现代工厂生产车间的科技与管理创新

一、现代工厂生产车间&#xff1a;高度集成、自动化与智能化 在当今这个日新月异的工业时代&#xff0c;工厂生产车间已经远远超越了传统意义上的简单生产线概念&#xff0c;它们正逐步演变为一个高度集成、自动化与智能化的生态系统。这一变革不仅极大地提升了生产效率&#…

实战项目:俄罗斯方块(七)

文章目录 &#x1f34a;自我介绍&#x1f34a;图形存储及输出设置类型设计图形输出代码设计要实现的结果展示user_global.c(全局变量的C文件)user_print.huser_print.cmain.c 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以&#xff1a;点赞关注评论收藏&#xff08;一…