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

C++之list模拟实现

一.介绍list

同vector一样都是容器,list底层:双向循环链表,由前驱指针、后继指针和数据组成,与vector不同于不是连续内存,vector是连续数组。

优点:任意位置插入,删除元素时间复杂度为O(1),erase删除时,仅仅被删除的节点迭代器失效,其余迭代器依旧有效

缺点:不支持下标访问,遍历效率低

二.list实现

1.list构造函数

2.list iterator

此处begin和end为正向迭代器(反向还莫有学),可进行++操作,迭代器向后移。

swap交换:先给自己一个头指针,再把需要交换的头指针给 给创建好的头指针,再把临时对象tmp的新头指针给原来的,完成交换。

为什么会有list类和list iterator类

list容器管整块链表数据,迭代器iterator专门管单个节点的访问、遍历,分工完全不一样,必须拆成两个类;

后者掌管:

1. 重载 * 解引用: *it 取出节点里存储的数据T

2. 重载 ++ 前置/后置自增: it++ 跳到下一个节点 _pNode = _pNode->_pNext

3. 重载 -- 自减:往前遍历上一个节点

4. 重载 == != :判断两个迭代器是否指向同一个节点

为什么要重载++,--:相较于vector,它空间是连续的,

1. vector迭代器本质就是封装的原生T*指针
vector内存连续,原生指针天然支持 ++ 、 -- 、 +n 、 [] 随机偏移:指针自增直接跳到下一个相邻元素。
所以不用手动重载 operator++ 、 operator-- ,直接复用原生指针自带的运算规则即可。

2. list不能用裸指针做迭代器,必须手动重载所有运算符
list节点零散分布在堆上,前后节点内存地址并不挨着。
单纯对节点Node*做 ++ ,只会走到这块内存后面随机地址,找不到下一个链表节点。
只能手动写重载

一、为啥三个模板参数
1. T :链表存的数据类型

2. Ref (引用)、 Ptr (指针):用来一套代码做出两种迭代器

- 普通迭代器: Ref=T&、Ptr=T* ,能读写数据

- const迭代器: Ref=const T&、Ptr=const T* ,只能读不能改
不用写两份重复代码,省事。

3. Self :给自己这个迭代器类起短别名,少写长名字。

二、各个函数为啥对应不同类型
1. Ref operator*() :解引用取值,用Ref控制能不能修改元素

2. Ptr operator->() :箭头访问成员,用Ptr控制读写权限

3. 拷贝构造、++运算符用 Self :指代迭代器本身类型,书写简单,方便链式运

总代码:

http://www.jsqmd.com/news/1340880/

相关文章:

  • Python Pygame贪吃蛇游戏开发:从零实现经典游戏逻辑与图形绘制
  • SpringBoot3+Vue3+MySQL 电子设备保修售后管理系统源码 前后端分离实战
  • 锦州装修公司到底怎么选?看准这几点,找从业十年以上团队才靠谱 - 官方资讯
  • 3分钟搞定防撤回:你的微信QQ消息永久保存终极方案
  • 传统酒吧互动游戏 vs 元宇宙酒吧互动体验:哪种更适合你的场地?
  • Unity地形制作:Heightmap核心原理与实战全流程指南
  • 5分钟快速修复!GModPatchTool终极指南解决Garry‘s Mod启动崩溃问题
  • 数字广告生态核心:ADX、DSP、SSP、DMP、ADN 概念解析与实战指南
  • vscode的background插件突然是用不了的解决方法
  • 从政府工作报告看金刚石量子科技路径,北睿分享实践进展
  • 告别繁琐演示!ppInk:让Windows屏幕标注变得简单高效的5个秘诀
  • 2026年8月九江旅行社怎么选?4个标准+1家推荐 - 江西旅讯
  • Windows系统终极激活指南:KMS_VL_ALL_AIO一键智能激活解决方案
  • C++虚析构函数原理与应用:多态销毁与内存安全
  • 在锦州装修如何找到靠谱公司?这份实用指南帮你避开常见陷阱 - 官方资讯
  • FantiaDL完整指南:如何轻松备份你的Fantia收藏内容
  • E-E-A-T原则在GEO中的应用:如何让AI认为你是行业权威?
  • GModPatchTool:5分钟解决Garry‘s Mod所有启动和性能问题的终极修复工具
  • 保定房屋漏水怎么办?超人防水补漏(全国连锁)深耕全城各区专注解决保定各类季节性渗漏难题2026.8月新 - 吉林同城获客
  • 酒店行业定岗定编成功案例:北京华恒智信按班次和客流分级配置
  • Topit:简单三步实现macOS窗口置顶,彻底解决多窗口遮挡问题
  • Linux之进程间通信(二)---模拟进程池
  • 技术实践中的“抽盲盒”:如何将不确定性转化为可控的工程能力
  • PDF转Word/压缩/格式互转一篇读懂:2026年国内免费工具终极选择指南
  • Docker-compose部署Redis全攻略:从配置到故障排查
  • 告别设备切换烦恼:Input Leap让你的键盘鼠标自由穿梭多台电脑
  • 锦州业主必看:选装修公司时,如何精准辨别环保真伪与优劣 - 官方资讯
  • 小微企业项目管理软件怎么选?适配小团队的实用工具汇总 - 装修新知
  • 5分钟快速上手:Axure RP中文语言包完整配置指南
  • TrollInstallerX:3分钟解锁iOS应用安装自由,告别7天签名限制