C++中STL的list类常用接口及其源码解析

1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。

2. list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向 其前一个元素和后一个元素。

3. list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高 效。

4. 与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率 更好。

5. 与其他序列式容器相比,list和forward_list最大的缺陷是不支持任意位置的随机访问,比如:要访问list 的第6个元素,必须从已知的位置(比如头部或者尾部)迭代到该位置,在这段位置上迭代需要线性的时间 开销;list还需要一些额外的空间,以保存每个节点的相关联信息(对于存储类型较小元素的大list来说这 可能是一个重要的因素

list常用的接口

list (size_type n, const value_type& val = value_type())

list()

list (const list& x)

list (InputIterator first, InputIterator last)

begin + end 返回第一个元素的迭代器+返回最后一个元素下一个位置的迭代器

rbegin + rend 返回第一个元素的reverse_iterator,即end位置,返回最后一个元素下一个位置的 reverse_iterator,即begin位置

a2cee69a37a3403db207d56f59993b84.jpg

empty

size

front

back

push_front在list首元素前插入值为val的元素

pop_front删除list中第一个元素

push_back在list尾部插入值为val的元素

pop_back删除list中最后一个元素

insert在list position 位置中插入值为val的元素

erase删除list position位置的元素

swap交换两个list中的元素

clear 清空list中的有效元素

list的迭代器失效

前面说过,此处大家可将迭代器暂时理解成类似于指针,迭代器失效即迭代器所指向的节点的无效,即该节 点被删除了。因为list的底层结构为带头结点的双向循环链表,因此在list中进行插入时是不会导致list的迭代 器失效的,只有在删除时才会失效,并且失效的只是指向被删除节点的迭代器,其他迭代器不会受到影响。(注意与vector比较)

模拟实现见此文最后

C++中STL的vector类常用接口及其源码解析-CSDN博客

vector和list的不同点

1.底层结构:
vector是一段连续的空间,用动态顺序表实现,而list是一个带头结点的双向链表;

2.是否支持随机访问:
vector支持随机访问,list不支持随机访问
vector访问某个元素的效率为O(1),
list访问某个元素的效率为O(n)

3.任意位置插入和删除元素的效率:
vector中效率低,时间复杂度为O(n),list中效率高,时间复杂度为O(1)

原因在于vector中插入元素时,从插入位置开始所有元素都要往后移动一位,还可能需要增容,申请新的空间,拷贝原来的空间的内容,再释放原有的空间,增容代价高,而删除一个元素,从删除位置的下一位开始所有元素都要向前移动一位;list中增加和删除节点只需要改变指针的指向,申请和释放单个元素的空间,代价相对较小。

4.空间利用率
vector底层为连续空间,不容易造成内存碎片,空间利用率高,缓存利用率高;
list底层节点动态开辟,小节点容易造成内存碎片,空间利用率低,缓存利用率低;

5.迭代器
vector中的迭代器是原生态指针,也就是元素类型的指针;
list中的迭代器是对原生态指针(节点指针)的封装;

6.迭代器失效
vector中插入和删除都可能导致迭代器失效,而list中插入元素不会导致迭代器失效,删除元素会导致迭代器失效;
vector中插入元素有可能需要增容,迭代器指向的之前的空间会被释放,之前的迭代器会失效;删除元素也会导致迭代器失效;
list中插入元素只是添加了一个新的节点,不会导致之前存在的迭代器失效,而删除元素只会导致当前迭代器失效,其他迭代器不会受到影响;

7.使用场景
vector适用于需要高速存储的,支持随机访问的,不关心插入删除效率的场景;
list适用于需要进行大量插入和删除操作的,不关心随机访问的场景

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

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

相关文章

csp2024T3

题目大意:对于每个数而言,可以将其染成红或蓝,对于每一个数,定义其贡献为,当且仅当这个数最近的同色数与其相等,否则其贡献为0,求最大贡献和。 思路:考虑dp 1.考场20多分钟想的奇怪…

Leetcode 198. 打家劫舍 动态规划

原题链接&#xff1a;Leetcode 198. 打家劫舍 class Solution { public:int rob(vector<int>& nums) {int n nums.size();if (n 1)return nums[0];int dp[n];dp[0] nums[0];dp[1] max(nums[1], nums[0]);for (int i 2; i < n; i) {dp[i] max(dp[i - 2] num…

Spring源码学习(五):Spring AOP

免责声明 本人还处于学习阶段&#xff0c;如果内容有错误麻烦指出&#xff0c;敬请见谅&#xff01;&#xff01;&#xff01;Demo <dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.8.8<…

外包干了6年,技术退步明显.......

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入杭州某软件公司&#xff0c;干了接近6年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了6年的功能测试…

24/11/5 算法笔记adagrad 自适应学习率

AdaGrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种用于随机优化的算法&#xff0c;它通过适应每个参数的学习率来优化目标函数。 自适应学习率&#xff1a; AdaGrad算法的核心特点是为每个参数自适应地调整学习率。这意味着每个参数都有自己的学习率&#xff…

逆向之断点和找解密方法

企名片科创平台 先找到解密内容 ctrlshiftF搜索关键字,一般用一个函数包裹的就是解密方法 有2个方法调用,给其中一个打上断点刷新页面,为什么要打断点?为什么不打断点我就没有办法在控制台直接输出变量的值或者调用函数呢&#xff1f;个人理解这时候i只是一个局部变量&#x…

【云备份】httplib库

目录 1.httplib库简介 2.httplib请求类 3.httplib响应类 4.Server类 5.Client类 6.httplib库搭建简单服务器 6.1.ubuntu20.04使用防火墙开放端口 6.2.效果 7.httplib库搭建简单服务器 注意&#xff1a;如果对HTTP不熟悉就去&#xff1a;【网络】HTTP_yum install telne…

【CENet】多模态情感分析的跨模态增强网络

在MSA领域&#xff0c;文本的准确度远远高于音频和视觉&#xff0c;如果文本能达到90%&#xff0c;那么音频和视觉的准确度只有60%~80%&#xff0c;但是过往研究很少针对情感分析的背景下去提高音频和视频的准确度。 abstract&#xff1a; 多模态情感分析&#xff08;MSA&…

多线程--模拟实现定时器--Java

一、定时器的概念 定时器的本质就是一个闹钟&#xff0c;时间到了开始执行某些逻辑。Java标准库中的定时器是Timer。 我们查阅Java文档可以详细看到定时器的使用方法&#xff1a; Timer最核心的方法就是schedule方法。值得注意的是我们通常描述任务是使用Runnable来描述&…

‌MySQL中‌between and的基本用法‌

文章目录 一、between and语法二、使用示例2.1、between and数值查询2.2、between and时间范围查询2.3、not between and示例 BETWEEN AND操作符可以用于数值、日期等类型的字段&#xff0c;包括边界值。 一、between and语法 MySQL中的BETWEEN AND操作符用于在两个值之间选择…

视频一键转换3D:Autodesk 发布 Video to 3D Scene

Video 3D Scene 最近 Autodesk 旗下公司 Wonder Dynamics 推出了 Wonder Animation 的测试版&#xff0c;它使用突破性的视频到 3D 场景技术&#xff0c;通过将任何视频序列转换为 3D 动画场景来加速动画电影的制作。 Video 3D Scene Video 3D Scene 生成效果 作为 Wonder Stud…

数据结构 C/C++(实验一:线性表)

&#xff08;大家好&#xff0c;今天分享的是数据结构的相关知识&#xff0c;大家可以在评论区进行互动答疑哦~加油&#xff01;&#x1f495;&#xff09; 目录 提要&#xff1a;实验题目 一、实验目的 二、实验内容及要求 三、算法思想 实验1 实验2 四、源程序及注释 …

关于SQLServer在局域网内无法连接的问题的解决思路

针对SQL Server 2008在局域网内无法连接的问题&#xff0c;以下是一些详细的解决办法。我们在过程中需要用到Microsoft SQL Server 2008和Microsoft SQL Server tools 2008数据库软件中的配置管理器以及SQL Server Management Studio工具&#xff0c;入下截图所示。 一、检查网…

【C++】RBTree——红黑树

文章目录 一、红黑树的概念1.1 红⿊树的规则&#xff1a;1.2 理解最长路径长度不超过最短路径长度的 2 倍1.3 红⿊树的效率 二、 红⿊树的实现2.1 红⿊树的结构2.2 红⿊树的插⼊2.2.1 红⿊树树插⼊⼀个值的⼤概过程 2.3 红⿊树的插⼊代码实现 一、红黑树的概念 红⿊树是⼀棵⼆…

Docker-- cgroups资源控制实战

上一篇&#xff1a;容器化和虚拟化 什么是cgroups&#xff1f; cgroups是Linux内核中的一项功能&#xff0c;最初由Google的工程师提出&#xff0c;后来被整合进Linux内核; 它允许用户将一系列系统任务及其子任务整合或分隔到按资源划分等级的不同组内&#xff0c;从而为系统…

vscode ssh连接autodl失败

autodl服务器已开启&#xff0c;vscode弹窗显示连接失败 0. 检查状态 这里的端口和主机根据自己的连接更改 ssh -p 52165 rootregion-45.autodl.pro1. 修改config权限 按返回的路径找到config文件 右键--属性--安全--高级--禁用继承--从此对象中删除所有已继承的权限--添加…

你适合哪种tiktok广告账户类型?

TikTok在广告营销方面的分类体系极为详尽。在开设广告账户时&#xff0c;根据不同的海外市场和商品类型&#xff0c;TikTok会有各自的开户标准。此外&#xff0c;广告主所开设的TikTok广告账户类型会直接影响其可投放的广告类型。在广告出价方面&#xff0c;广告主的营销目标不…

大规模语言模型:从理论到实践(1)

1、绪论 大规模语言模型&#xff08;Large Language Models&#xff0c;LLM&#xff09;是由包含数百亿以上参数的深度神经网络构建的语言模型&#xff0c;采用自监督学习方法通过大量无标注文本进行训练。自2018年以来&#xff0c;多个公司和研究机构相继发布了多种模型&#…

SpringBoot中@Validated或@Valid注解校验的使用

文章目录 SpringBoot中Validated或Valid注解校验的使用1. 添加依赖2. 使用示例准备2-1 测试示例用到的类2-2 实体Dto&#xff0c;加入校验注解2-2 Controller 3. 示例测试4. Valid 和 Validated注解详解4-1 常用规则注解4-2 分组验证4-2-1 示例准备4-2-2 Controller接口4-2-3 P…

HarmonyOS使用arkTS拉起指定第三方应用程序

HarmonyOS使用arkTS拉起指定第三方应用程序 前言代码及说明bundleName获取abilityName获取 前言 本篇只说采用startAbility方式拉起第三方应用&#xff0c;需要用到两个必备的参数bundleName&#xff0c;abilityName&#xff0c;本篇就介绍如何获取参数… 代码及说明 bundle…