【C++】STL标准库之list

news2024/11/19 10:23:53

STL标准库之list

  • list类的简介
  • 常用的list类的接口
    • 构造
    • 迭代器
    • 容量
    • 访问
    • 修改
  • list和vector的区别

list类的简介

list是一种序列式容器,可以在任意位置插入和删除元素,并且其时间复杂度为O(1),在底层,list是双向链表结构,每个节点通过指针指向下一个节点,因此最大的缺陷是不支持随机访问,必须从已知位置开始迭代到该位置,同时节点除了存储val值之外,还要存储指针,因此需要一些额外的空间。
在这里插入图片描述
由于双向带头循环链表的存在,使得list在找尾时无需从头开始遍历,这样就有效降低了查找时候的时间复杂度。(头节点不存储数据,只是记录了当前list的第一个节点的地址和最后一个节点的地址)

常用的list类的接口

构造

函数名称功能
list(size_type n, const value_type& val = value_type())n个值为value的元素
list()空列表
list(const list& x)拷贝构造
list(InputIterator first, InputIterator last)用first和last进行区间构造

对应写法:

list<int> l(10, 5);
list<int> l2();
list<int> l3(l2);

int arr[] = {1,2,3,4,5};
int n = sizeof(arr)/sizeof(arr[0]);
list<int> l4(arr, arr+n);

迭代器

函数名称功能
begin()+end()返回第一个元素的迭代器和最后一个元素的迭代器
rbegin()+rend()返回第一个元素的reverse_iterator,即end位置,返回最后一个元素下一个位置的reverse_iterator,即begin位置

在这里插入图片描述
从迭代器的在list中的位置可以看到,begin()实际上在第一个有效节点的位置,而end()在头节点的位置,那么为何要这样设置呢?

实际上,这样设置迭代器后,就可以很快速的找到当前链表的头和尾了,当需要找尾时,使用end()指向节点中的prev就可以快速找到,如果需要判断当前列表是否为空呢,实际上直接判断end()指向的值和begin()指向的值是否相等,如果相等,意味着head节点就是当前列表中唯一的节点,那么就说明当前列表为空。

在这里插入图片描述

判读是否为空就可以直接判断end和begin是否相等,因为当只有一个头节点的时候,prev和next指向的都是头节点。

容量

函数名称功能
empty判断是否为空列表
size计算当前列表中有多少个有效节点

访问

函数名称功能
front返回第一个节点中值的引用
back返回最后一个节点中值的引用

如果需要进行遍历,由于list特性,是不支持直接使用[]进行随机访问的,需要我们通过头节点逐个迭代。

修改

函数名称功能
push_front头插一个元素
pop_front头删一个元素
push_back尾插一个元素
pop_back尾删一个元素
insertpos位置插入元素
erasepos位置删除元素
swap交换两个list中的元素
clear清空list中的元素

请注意:针对迭代器失效的问题,在vector中我们说,任何可能会导致扩容的操作都可能会导致迭代器失效,同时删除也会导致删除当前位置以及后续所有的迭代器失效。但是在list中,由于使用链式存储方式,因此不存在扩容的情况,因此扩容不会导致迭代器失效,而删除操作会导致当前位置的迭代器失效,并不会影响后续的迭代器。

list和vector的区别

由于vector和list两个容器的底层结构不同,导致其特性以及应用场景不同。

vectorlist
底层结构动态的顺序表,一段连续空间带头节点的双向循环链表
随机访问支持随机访问,访问效率O(1)不支持,访问效率O(n)
插入和删除在任意位置插入和删除的效率低,需要整个搬移元素,时间复杂度为O(n),插入时可能要增容,效率低支持在任意位置的插入和删除时间复杂度都为O(1),并且无需扩容,拷贝元素,效率高
空间利用率底层为连续空间,不易造成内存碎片,空间利用率高,缓存利用率高底层动态开辟节点,小节点容易造成内存碎片,空间利用率低,缓存利用率低
迭代器例如需要进行++,迭代器为原生态的指针,指针++也就是向后偏移一个元素需要对指针进行封装,因为迭代器本身是不能通过++访问到下一个元素的(元素之间使用指针相连)
迭代器失效插入元素时,可能会导致扩容,这样就会使得所有的迭代器都失效,因此需要对迭代器重新赋值,删除元素时也需要重新赋值,否则也会失效插入元素不会扩容,只有删除元素会导致当前位置迭代器失效,其他位置迭代器没有影响
使用场景需要高效存储支持随机访问的场景,不关心插入删除的效率涉及到大量的插入和删除,不关心随机访问

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

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

相关文章

《CTFshow-Web入门》08. Web 71~80

Web 71~80 web71知识点题解 web72知识点题解 web73题解 web74题解 web75知识点题解 web76题解 web77知识点题解 web78知识点题解 web79题解 web80知识点题解 ctf - web入门 web71 知识点 ob_get_contents()&#xff1a;得到输出缓冲区的内容。ob_end_clean()&#xff1a;清除…

程序员:面试造飞机,入职拧螺丝?真难···

刚开始工作的时候&#xff0c;我也想不通这个问题&#xff0c;甚至很鄙视这种现象。后面当了面试官&#xff0c;做到了公司中层管理&#xff0c;也会站在公司以及行业角度去重新思考这个问题。 为什么这种现象会越来越普遍呢&#xff1f;尤其在 IT 行业愈加明显。 面试看的是…

树与二叉树

我们之前讲过的链表和顺序表都是线性结构的数据结构&#xff0c;那么我们肯定会想有没有一种数据结构的形式不是线性结构而是其他的形式呢&#xff1f;今天我们就来学习一种新的数据结构——树形结构。 &#x1f335;初识树形结构 树形结构就是像我们上面的图形一样。因为像是…

Java从入门到转行

Java开发从入门到转行 Java基本介绍Java学习路线Java学习须知Java学习文档Java SEJava 对象与类Java 基本数据类型Java 变量类型Java 修饰符Java 运算符Java 循环结构Java 条件语句Java switch caseJava 数组Java 日期与时间Java 正则表达式Java 方法Java 流(Stream)、 File、 …

A Restful API

SpringBoot 定义Restful API 定义POJOOrderBuyer 定义RestfulControllerGet API for queryPost API for addPut API for updateDelete API for delete 定义AjaxResponse Patavariable RequestParm RequestBodyRequestHeader 定义POJO Order import java.util.Date; import ja…

工厂方法模式

// 简单工厂模式 #include <iostream> #include <string>// 抽象产品类 class Product { public:virtual ~Product() {}virtual std::string getName() 0; };// 具体产品类A class ProductA : public Product { public:std::string getName() {return "Produ…

Swiper总结

文章目录 Swiper总结概述使用简单使用自动切换分页器样式切换效果预览视差效果延迟加载自适应高度放大缩小 案例tab切换引导页 Swiper总结 概述 Swiper是纯javascript打造的滑动特效插件&#xff0c;面向手机、平板电脑等移动终端。 Swiper能实现触屏焦点图、触屏Tab切换、触…

第三节课 Linux文件权限

Linux是多人多任务的操作系统&#xff0c;因此可能常常会有多人使用一台机器&#xff0c; 为了考虑每个人的隐私、方便用户合作&#xff0c;每个文件都有三类用户&#xff0c;权限是基于这三类用户设定的&#xff1a; 1) 文件拥有者&#xff08;user&#xff09; 2) 组用户&a…

SpringBoot 自定义注解实现Redis缓存功能

背景 最近小A的公司要做一个大屏可视化平台&#xff0c;主要是给领导看的&#xff0c;领导说这个项目要给领导演示&#xff0c;效果好不好直接关系到能不能拿下这个项目&#xff0c;领导还补了一句“这项目至少是百万级的&#xff0c;大伙要全力以赴”&#xff0c;早上小A还想…

走近大数据——什么是大数据、计算架构的发展

文章目录 一、什么是大数据二、大数据计算架构的发展1.RDBMS阶段2.Hadoop Map-Reduce阶段3.Spark阶段4.Flink阶段 参考 一、什么是大数据 大数据是指无法在有限时间内用常规软件工具对其进行获取、存储、管理和处理的数据集合。 大数据的特点&#xff1a; 海量化&#xff1a;数…

少年不懂孔乙己,读懂已是书中人

文章目录 前言梗从何来互联网文学背后的焦虑给学弟学妹的建议 前言 《孔乙己》是近代文学巨匠鲁迅所著的短篇小说。 大概故事讲的是孔乙己是站着喝酒而穿长衫的&#xff08;那时候穿长衫的人代表着有知识&#xff09;唯一人&#xff0c;穿的虽然是长衫&#xff0c;可是又脏又破…

SpringMVC概述

SpringMVC概述 1. SpringMVC概述1.1 SpringMVC概述 2. 入门案例【重点】2.1 实现步骤2.2 代码实现【第一步】创建web工程&#xff08;Maven结构&#xff09;【第二步】设置tomcat服务器&#xff0c;加载web工程【第三步】导入坐标&#xff08;SpringMVCServlet&#xff09;【第…

璞华助力“数字人社”,为成都市人社数字化建设提供多方位的产品与技术支持!

新的时期&#xff0c;人力资源和社会保障事业进入新一轮的制度创新和加快发展阶段。把对各项人力资源和社会保障业务的支持和服务纳入信息化建设&#xff0c;通过 “数字人社”信息化建设项目&#xff0c;是充分利用新一代信息技术&#xff0c;有效整合各类信息资源&#xff0c…

ChatGPT背后的打工人:你不干,有的是AI干

AI“出圈” 如今&#xff0c;数字技术发展速度惊人&#xff0c;AI提高了社会生产效率&#xff0c;更真切地冲击到原有的生产秩序。 年初AI技术的爆发&#xff0c;让国内看到了进一步降本增效的希望。 国内多家互联网企业相继推出类ChatGPT产品&#xff0c;复旦大学邱锡鹏教授…

清洁赛道新势力,米博凭“减法”突围?

在五四青年节这个特殊的日子&#xff0c;方太旗下的高端智能清洁品牌“米博”发布了新一代无滚布洗地机7系列。 5月4日晚&#xff0c;米博以“减法生活&#xff0c;净请7代”为主题&#xff0c;举办了新品发布会。在发布会上&#xff0c;从小红书翻红的董洁作为方太集团米博产…

持之以恒奖牌来啦,带你提前看~

加油&#xff0c;让我们继续持之以恒吧&#xff01;

Flutter 中使用 dart:html 的条件导入

Flutter 中使用 dart:html 的条件导入 Flutter 是一个跨平台的 UI 框架&#xff0c;可以让你用一套代码开发 Android、iOS、Web 和桌面应用。但是&#xff0c;不同的平台有不同的特性和限制&#xff0c;所以有时候你可能需要根据平台来导入不同的库或代码。这时候&#xff0c;…

社交“搭子”火了!小红书数据分析,品牌正用“陪伴”种草?

找搭子&#xff0c;年轻人在搞一种很新的社交 朋友&#xff0c;你找搭子了吗&#xff1f;近期&#xff0c;“搭子”这种新型社交关系走红&#xff0c;饭搭子、奶茶搭子、厕所搭子、旅游搭子……遍布于各式各样的场景中&#xff0c;主打的就是一个垂直细分领域的精准陪伴。“搭子…

数字化转型:制造业企业,如何创新技术并借力发展?

数字中国峰会刚刚拉开帷幕&#xff0c;紧跟一波潮流。 在这个数字技术全面升级的关口&#xff0c;企业如何进更时代步伐&#xff0c;更好完成数字化转型和升级&#xff1f; 到底什么是数字化转型&#xff1f; 我们当下所看到的很多对“数字化”的理解&#xff0c;依然是“信…

【c++修行之路】模板

模板 一般我们在实现一个函数的时候&#xff0c;都会使用模板&#xff0c;因为如果将类型写死&#xff0c;下次再使用的时候就要新写一个函数&#xff0c;尽管重载可以让名字方便&#xff0c;但每重载都要自己去写一个函数&#xff0c;这样非常麻烦&#xff0c;所以模板就是让…