当前位置: 首页 > news >正文

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

目录

一.基本介绍

二.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进行模拟实战,欢迎持续关注

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • idea新建父工程和添加导入新模块的步骤
  • 关于STM32运行时卡住问题
  • Adobe DC 2022提示无法识别的错误 - 解决方案
  • C4 单细胞测序中,oligo文库 和 cDNA 文库 各自的功能和区别
  • 【Kubernetes知识点问答题】Service 发现
  • TPM在解决哪些类型的问题时最有效?
  • log4j 清除MDC上下文 MDC分类日志
  • Python Tkinter小程序
  • 10,sql约束(2)
  • RedisStack十部曲之二:Redis的核心概念
  • python读取excel数据详细解说
  • 基于RK3568平台移植ffmpeg3.4.5及ffmpeg验证
  • 2408wtl,解析快捷方式
  • 解决UOS开发截图时电脑滴滴声
  • 求解组合优化问题的具有递归特征的无监督图神经网络
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • Android Studio:GIT提交项目到远程仓库
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • canvas 绘制双线技巧
  • gitlab-ci配置详解(一)
  • golang中接口赋值与方法集
  • JavaScript新鲜事·第5期
  • Java知识点总结(JavaIO-打印流)
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • ng6--错误信息小结(持续更新)
  • Spring Cloud中负载均衡器概览
  • vuex 笔记整理
  • 反思总结然后整装待发
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 聊聊hikari连接池的leakDetectionThreshold
  • 前端技术周刊 2019-02-11 Serverless
  • 译自由幺半群
  • 用element的upload组件实现多图片上传和压缩
  • ​linux启动进程的方式
  • ​如何在iOS手机上查看应用日志
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • ​香农与信息论三大定律
  • ​一些不规范的GTID使用场景
  • #VERDI# 关于如何查看FSM状态机的方法
  • #进阶:轻量级ORM框架Dapper的使用教程与原理详解
  • #在 README.md 中生成项目目录结构
  • $$$$GB2312-80区位编码表$$$$
  • (C语言)球球大作战
  • (十八)三元表达式和列表解析
  • (一)utf8mb4_general_ci 和 utf8mb4_unicode_ci 适用排序和比较规则场景
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • *1 计算机基础和操作系统基础及几大协议
  • .net core 管理用户机密
  • .net core开源商城系统源码,支持可视化布局小程序
  • .Net 执行Linux下多行shell命令方法
  • .NET_WebForm_layui控件使用及与webform联合使用
  • .NET框架设计—常被忽视的C#设计技巧
  • .net通过类组装数据转换为json并且传递给对方接口
  • .net知识和学习方法系列(二十一)CLR-枚举
  • .net专家(高海东的专栏)