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

链表的‘跑酷’:C++ list 如何在数据中自由穿梭?

前言

本篇博客将详细介绍C++的list

💖 个人主页:熬夜写代码的小蔡

本篇文章所涉及的代码在Gitte仓库

码云——List

🖥 文章专栏:C++

若有问题 评论区见

🎉欢迎大家点赞👍收藏⭐文章 ​

d6b44a6e06316a12d6dec7f29fc29d7b.gif

ca618b2856ce45c78a02cc2a85b3b0f6.gif

一.list的介绍及使用

1.list的介绍

list是一种数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点(以及前一个节点)的指针。在C++中,std::list是一个双向链表,这意味着每个节点既可以向前也可以向后查找。

list的文档介绍http://www.cplusplus.com/reference/list/list/?kw=listhttp://www.cplusplus.com/reference/list/list/?kw=listhttp://www.cplusplus.com/reference/list/list/?kw=listhttp://www.cplusplus.com/reference/list/list/?kw=list

2.list的使用

2.1为什么使用 list

与数组或std::vector相比,std::list在处理频繁插入和删除操作时更加高效。这是因为链表不需要在内存中连续存储数据,插入或删除操作只需要调整节点的指针。

list中的接口比较多,此处类似,只需要掌握如何正确的使用,然后再去深入研究背后的原理,已
达到可扩展的能力。以下为list中一些常见的重要接口。

  1. 默认构造函数:创建一个空的链表。
  2. 大小构造函数:创建一个指定大小的链表,元素默认初始化为默认值(如int初始化为0)。
  3. 值初始化构造函数:创建一个指定大小的链表,所有元素初始化为指定值。
  4. 范围初始化构造函数:通过另一个容器的迭代器范围初始化链表。
  5. 拷贝构造函数:通过另一个链表进行深拷贝初始化。
  6. 移动构造函数:通过另一个链表进行移动初始化(资源转移,原链表被置空)。
  7. 初始化列表构造函数:使用花括号{}的初始化列表直接初始化链表。


  8. 分类说明

  9. 元素操作:这些接口用于添加、删除或修改链表中的元素。
  10. 容量和状态查询:这些接口用于获取链表的大小或判断链表是否为空。
  11. 访问元素:这些接口用于访问链表开头或末尾的元素。
  12. 迭代器操作:这些接口用于遍历链表或反向遍历链表。
  13. 链表操作:这些接口用于对链表进行整体操作,如清空、排序、合并或反转。

2.2 list的模拟实现 

由于代码比较多,所以不在博客中直接展示,放在下面的码云中

码云——Listhttps://gitee.com/cai-bowei/text.c/blob/master/12.list/list/LIst.hhttps://gitee.com/cai-bowei/text.c/blob/master/12.list/list/LIst.hhttps://gitee.com/cai-bowei/text.c/blob/master/12.list/list/LIst.h

 2.3list的迭代器失效

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

int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
list<int> l(array, array + sizeof(array) / sizeof(array[0]));
auto it = l.begin();
while (it != l.end())
{
	// erase()函数执行后,it所指向的节点已被删除,因此it无效,在下一次使用it时,必须先给
	//其赋值
	//l.erase(it);
	//++it;
//更改
	it = l.erase(it++);
}

二.list与vector的对比

 


http://www.kler.cn/a/543091.html

相关文章:

  • CentOS虚机在线扩容系统盘数据盘
  • uniapp + vite + 使用多个 ui 库
  • DevOps的个人学习
  • 【DeepSeek服务器繁忙,请稍后再试...如何解决?】
  • PyQt学习记录01——加法计算器
  • 算法04-希尔排序
  • IGBT工作原理
  • Barra多因子模型
  • 回归新系列——网络安全实操干货系列——Kali Linux新版本——Kali Purple实操指南——信息收集篇1——Nmap(其一)
  • AI赋能前端开发:加速你的职业晋升之路
  • 大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡
  • 玩转状态模式
  • Linux下的进程切换与调度
  • Spark商品销售数据可视化分析系统 机器学习预测算法 讲解视频 论文 大数据毕业设计 Hadoop和Hive 销量预测✅
  • 【github】docker realtime
  • 探索RDMA技术:从基础到实践
  • 【Qt】定期清理程序
  • AI写代码工具赋能前端工程师,加速职业晋升
  • 二叉树详解
  • 对前端的技术进行分层
  • 关于FC设备Map 系统的一些需求思考
  • OpenBayes 教程上新 | 告别服务器繁忙,DeepSeek 一键部署教程上线!
  • 解锁电商数据宝藏:淘宝商品详情API实战指南
  • 微信小程序的制作
  • 学习docker!!!
  • Qt手撸控件不显示问题