C++ STL 容器 list

目录

  • 1. list 对象
  • 2. list 迭代器
    • 2.1 实现
    • 2.2 迭代器失效


本文测试环境为 gcc 13.1

1. list 对象

std::list 底层是一个双向循环链表

list 对象本身包含一个头节点,通过指针指向元素节点,节点定义如下

在这里插入图片描述
头节点 header 和元素节点 node 都继承于基类 node_base

list<int> l;

所以 sizeof(l) = 8 + 8 + 8 = 24,一个 list 对象本身是 24 字节大小,头节点分配在栈上,而元素节点则通过 new 分配在堆上

具体模型如下图所示
在这里插入图片描述
可以看出,只要得到其中某个节点的迭代器,就可以以常数时间来进行插入和删除,但因为空间不连续,不支持快速随机访问

2. list 迭代器

2.1 实现

list 中的元素是不连续存储的,可不能像 vector 那样使用一个普通指针就能实现

想要通过这个迭代器访问每个元素,当然就需要 next 和 prev 指针了

这样,就可以使用 node_base 来实现,和 vector 一样,对这个进行封装,提供迭代器需要的功能

list 迭代器实现为双向迭代器,需要满足以下功能

运算说明
*解引用,得到迭代器指向元素的值
++it前置递增,将迭代器指向下一个元素
it++后置递增,将迭代器指向下一个元素,并返回指向当前元素的迭代器副本
- -it前置递减,将迭代器指向前一个元素
it- -后置递减,将迭代器指向前一个元素,并返回指向当前元素的迭代器副本
==,!=比较两个迭代器是否相等

很容易想到,++ 和 - - 不就对应 next 和 prev 吗,所以实现起来还是很简单的

那么怎么构造这个迭代器呢

vector 的迭代器最终就是一个指针,可以通过 start 指针来构造 begin(),finish 指针构造 end()

现在 list 的迭代器是对 node_base 的封装,是头节点和元素节点的基类,所以可以通过多态来实现,我们可以使用 head->next ,即第一个元素来构造 list 的 begin() 了,迭代器是用来遍历元素节点的,所以头节点作为 end(),刚好 head->prev 是最后一个元素,即 end() - 1 是最后一个元素

实现如下

template<typename _Tp>
struct _List_iterator
{typedef _List_iterator<_Tp>		_Self;typedef _List_node<_Tp>			_Node;typedef ptrdiff_t				difference_type;typedef std::bidirectional_iterator_tag	iterator_category;typedef _Tp				value_type;typedef _Tp*				pointer;typedef _Tp&				reference;//...	// The only member points to the %list element.__detail::_List_node_base* _M_node;
};

对 node_base 进行封装

构造

 _List_iterator() _GLIBCXX_NOEXCEPT: _M_node() { }explicit_List_iterator(__detail::_List_node_base* __x) _GLIBCXX_NOEXCEPT: _M_node(__x) { }

解引用

// Must downcast from _List_node_base to _List_node to get to value.
_GLIBCXX_NODISCARD
reference
operator*() const _GLIBCXX_NOEXCEPT
{ return *static_cast<_Node*>(_M_node)->_M_valptr(); }_GLIBCXX_NODISCARD
pointer
operator->() const _GLIBCXX_NOEXCEPT
{ return static_cast<_Node*>(_M_node)->_M_valptr(); }

++ 、–

_Self&
operator++() _GLIBCXX_NOEXCEPT
{_M_node = _M_node->_M_next;return *this;
}_Self
operator++(int) _GLIBCXX_NOEXCEPT
{_Self __tmp = *this;_M_node = _M_node->_M_next;return __tmp;
}_Self&
operator--() _GLIBCXX_NOEXCEPT
{_M_node = _M_node->_M_prev;return *this;
}_Self
operator--(int) _GLIBCXX_NOEXCEPT
{_Self __tmp = *this;_M_node = _M_node->_M_prev;return __tmp;
}

比较

_GLIBCXX_NODISCARD
friend bool
operator==(const _Self& __x, const _Self& __y) _GLIBCXX_NOEXCEPT
{ return __x._M_node == __y._M_node; }#if __cpp_impl_three_way_comparison < 201907L
_GLIBCXX_NODISCARD
friend bool
operator!=(const _Self& __x, const _Self& __y) _GLIBCXX_NOEXCEPT
{ return __x._M_node != __y._M_node; }
#endif

对迭代器的解引用就是获取元素节点的 data 了,如果是对头节点的迭代器解引用,那么就会出问题了,如果元素也是 size_t 之类的数值类型的话,可能就没啥问题

2.2 迭代器失效

list 迭代器失效的话,那就是看这个 node_base 指针指向的节点是否可以正常使用了

1.插入元素

插入新元素会影响其他节点的地址和 data 吗,显然不会

2.删除元素

删除一个元素会影响其他节点的地址吗,当然也不会,但是这个要删除的节点的地址就不能正常引用了

因为 vector 连续存储和重新分配特点,迭代器失效问题就多一点,而 list 节点不连续,互不影响

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

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

相关文章

历史遗留问题1-Oracle Mysql如何存储数据、索引

在学习到Oracle redo和undo时&#xff0c;涉及到很多存储结构的知识&#xff0c;但是网上的教程都不是很详细&#xff0c;就去复习了一下mysql&#xff0c;感觉是不是开源的问题&#xff0c;Mysql的社区和知识沉淀远高于Oracle&#xff0c; 对于初学者很友好&#xff0c;我想请…

2025考研数学武忠祥强化班视频,百度网盘课程+讲义PDF更新

25考研的小伙伴们现在应该基础都学习的差不多了吧&#xff01; 是时候进入强化阶段的学习啦。 2025考研数学强化班全程网盘&#xff1a;https://pan.baidu.com/s/1Z029fuCLkyyhIRFqd5QKcg 提取码&#xff1a;p3ue 晚上好&#xff0c;聊聊17堂课的看课攻略。 今年的17堂课还…

IP-guard WebServer 权限绕过漏洞复现(QVD-2024-14103)

0x01 免责声明 请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;作者不为此承担任何责任。工具来自网络&#xff0c;安全性自测&#xff0c;如有侵权请联系删…

Mac下brew安装php7.4

这里作者挂了梯子&#xff0c;所以很流畅&#xff01; brew的下载&#xff0c;可参考另外一篇博文&#xff5e;Homebrew 安装与卸载 1、将第三方仓库加入brew brew tap shivammathur/php2、安装指定版本的PHP brew install php7.43、替换Mac自带PHP环境并刷新环境变量 -> …

【ACM列表推荐会议 | EI稳定检索】2024年第四届人工智能、自动化与高性能计算国际会议(AIAHPC 2024)

2024年第四届人工智能、自动化与高性能计算国际会议&#xff08;AIAHPC 2024&#xff09; 2024 4th International Conference on Artificial Intelligence, Automation and High Performance Computing 2024第四届人工智能、自动化与高性能计算国际会议(AIAHPC 2024)将于20…

【网站项目】新生报到系统小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

局域网MongoDB的数据库访问不了

局域网MongoDB的数据库访问不了 确认bindIp: 0.0.0.0后&#xff0c;仍然是访问不了&#xff0c;查询资料发现是windows自带防火墙的问题 进入到 允许其他应用&#xff0c;选择mongod.exe的位置 这样就好了。

【电路笔记】-数字逻辑门总结

数字逻辑门总结 文章目录 数字逻辑门总结1、概述2、逻辑门真值表3、总结 数字逻辑门有三种基本类型&#xff1a;与门、或门和非门。 1、概述 我们还看到&#xff0c;数字逻辑门具有与其相反或互补的形式&#xff0c;分别为“与非门”、“或非门”和“缓冲器”&#xff0c;并且…

ansible进阶-剧本调试方法

目录 1、调试方法 2、实例 2.1 Debug模块 2.2 tags标签 2.3 忽略错误 1、调试方法 具体方法应用场景debug标签执⾏剧本的时候输出剧本的执⾏流程,⼀般配合register⼀起使⽤. 输出facts变量自定义变量tags标签给⼀些模块加上标签,运⾏剧本的时候可以运⾏指定标签的…

OpenHarmony UI动画-rebound

简介 rebound是一个模拟弹簧动力学&#xff0c;用于驱动物理动画的库。 下载安装 ohpm install ohos/reboundOpenHarmony ohpm环境配置等更多内容&#xff0c;请参考如何安装OpenHarmony ohpm 使用说明 import rebound from ohos/rebound;功能一&#xff1a;创建维护弹簧对…

MySQL 锁机制全面解析

目录 1. MySQL的锁类型1.1 全局锁1.2 表锁1.3 行锁1.4 共享锁&#xff08;读锁&#xff09;1.5 排它锁&#xff08;写锁&#xff09;1.6 死锁 2 乐观锁和悲观锁2.1 乐观锁2.2 悲观锁 3 意向锁4 间隙锁5 临键锁6. 事务隔离级别对锁的影响6.1 读未提交&#xff08;Read Uncommitt…

3ds Max2024安装包(亲测可用)

目录 一、软件简介 二、软件下载 一、软件简介 3ds Max是一款基于PC系统的强大3D建模、渲染和制作软件&#xff0c;广泛应用于游戏开发、影视后期制作、建筑设计、工业设计等多个领域。其拥有丰富的建模工具&#xff0c;可轻松创建逼真的三维场景和模型&#xff1b;同时&#…

OpenMesh 极小曲面(局部迭代法)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 我们的目标是想得到一个曲率处处为0的曲面,具体操作如下所述: 二、实现代码 #define _USE_MATH_DEFINES #include

Linux 操作系统gdb、makefile

今天是对前面两天的补充和完善。 1、gdb 1.1 gdb 作用 调试程序 1.2 调试bug的步骤 测试&#xff1a;发现问题 固化&#xff1a;让bug重现 定位&#xff1a;找到bug的位置 修改&#xff1a;修改bug 验证 1.3 gdb调试工具的使用 1->想要使用gdb调试工具&#xff0c;在编…

【网站项目】自习室预约系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

汽车充电桩充电效率的四大决定因素

随着电动汽车的快速普及&#xff0c;交流充电桩作为电动汽车的充电基础设施&#xff0c;其充电效率受到了广泛的关注。接下来&#xff0c;我们将深入探讨交流充电桩的充电效率&#xff0c;包括充电效率的定义、影响因素以及提升方法。 充电效率的定义 交流充电桩的充电效率指的…

【微信小程序从入门到精通(项目实战)】——微电影小程序

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

2024华中杯C题完整解题思路及代码

C 题 基于光纤传感器的平面曲线重建算法建模 光纤传感技术是伴随着光纤及光通信技术发展起来的一种新型传感器技 术。它是以光波为传感信号、光纤为传输载体来感知外界环境中的信号&#xff0c;其 基本原理是当外界环境参数发生变化时&#xff0c;会引起光纤传感器中光波参量&…

Vue前端框架如何调用天聚数行API?

Vue是一个业内优秀的前端解决方案&#xff0c;采用了最新流行的MVVM框架模式&#xff0c;深受web前端开发者的喜爱&#xff0c;在相关开发者社区也一直都是热门交流话题。那么&#xff0c;如何通过Vue调用天行数据的API接口呢&#xff0c;下面就具体给大家示例。 vue采用的是数…

数字零售力航母-看微软如何重塑媒体

数字零售力航母-看微软如何重塑媒体 - 从2024全美广播协会展会看微软如何整合营销媒体AI技术和AI平台公司 2024年&#xff0c;微软公司联合英伟达总司&#xff0c;赞助全美广播协会展会。本次展会微软通过搭建一个由全面的合作伙伴生态系统支持的可信和安全的平台&#xff0c;…