news 2026/8/14 14:45:32

STL中的list的介绍及模拟实现(C++)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
STL中的list的介绍及模拟实现(C++)

list介绍

list即数据结构中的链表,STL中实现的是带头双向链表,它的物理地址不连续。相比于vector,由于其物理地址不连续的特点,它的模拟实现较为复杂。咱们还是先介绍,认识一下,再尝试模拟实现

构造函数()
list()默认构造
list (const list& x)拷贝构造
list (InputIterator first, InputIterator last)通过任意容器的迭代器初始化
list (size_type n, const value_type& val = value_type())初始化为n个value值
迭代器的使用
begin+end分别返回指向第一个数据的迭代器和指向最后一个数据的下一个位置的迭代器
rbegin+rend分别返回指向最后一个数据的迭代器和指向第一个数据的前一个位置的迭代器
empty判断是否为空
size返回有效节点个数
数据访问
front返回第一个节点数据的引用
back返回最后一个节点数据的引用
增删查改
push_front在首元素前插入数据
pop_front删除首元素
push_back尾插
pop_back尾删
insert指定位置插入数据
erase指定位置删除数据
swap交换两个list
clear清空list

list模拟实现

首先我们要构建框架,因为是带头双向链表,我们List类中成员只需包含哨兵位(即链表的头),然后即可跟随链表结点中的next和prev遍历链表。按照C语言版的数据结构中的思路,List类中成员为头的地址,指向下一个结点的next指针,以及指向上一个结点的prev指针。STL则是将链表结点封装成了一个类(我命名为List_node),这样List 不用关心节点内部怎么存数据,只操作节点指针;新增 / 删除节点只需要创建 / 销毁List_node对象

因此,如下图所示我们的List类只有一个成员_head,其类型为List_node*即Node*

此外,List_node是struct类,因为无论其成员函数还是成员变量均可默认为public

由于list物理结构的特殊性,迭代器的实现不能跟vector等的那么简单,因为其前置++或后置++可能找到的不是当前结点的下一个结点,由此我们要想办法,结合前面的语法知识可以想到重载++以使他走到下一个结点(利用当前结点的_next)

(少实现了一个函数)

我们如此费力地实现了迭代器,我们可以不实现吗,答案是利大于弊

1、封装,通用的相似的遍历容器的方式,并且封装屏蔽容器结构的差异,和底层实现细节

2、通用/复用,实现算法时用迭代器函数模板方式实现,跟底层容器结构解耦

接下来就是const_iterator,无论是typedef还是函数重载都无法实现,因此我们可以考虑再封装一个const_List_iterator类,如下:

(少实现了一个函数)

有上面的铺垫后,我们在学习一下迭代器地两个模板类融合为一个类但能实现两个类的功能

为了List代码的可读性,做出如下处理

构造函数

empty_init函数(给list创建哨兵位)因为接下来的函数也要使用,封装成了函数

拷贝构造

利用初始化列表构造list

swap函数

赋值运算符重载

析构函数

clear函数

pop_back函数

push_front函数

pop_front函数

有关迭代器函数(利用匿名对象提高效率)

insert函数

push_back函数

这里实现较为复杂,是因为push_back函数的设计在insert之前,可以通过insert函数设计push_back函数,代码十分简洁

erase函数

size函数

如果list类中成员变量不含有效数据个数_size,此处size函数实现较为复杂,我们在list类中添加一个_size,size函数实现起来就简单多了

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/14 14:45:22

C语言 函数指针传参: 什么时候用/不用malloc 动态内存分配

目录 核心总纲(全文聚焦 malloc 核心规则)​ 一、致命错误:一级指针传参 函数内 malloc(高频必考坑)​ 二、一级指针唯一合法场景:不 malloc,仅修改已有内存内容​ 三、唯一合法 malloc 场…

作者头像 李华
网站建设 2026/8/14 14:44:02

短剧字幕翻译别只看通顺:5类错译会让剧情和配音一起翻车

短剧字幕翻译最容易被误判的一点是:看起来通顺,就以为质量不错。 实际做短剧出海时,通顺只是最低要求。短剧一集很短,剧情推进却很密。人物身份可能前几集隐藏,称谓会随关系变化,台词里的金额、否定、因果和…

作者头像 李华
网站建设 2026/8/14 14:42:32

注塑机数据采集联网分析作用

注塑机数据采集,读取注塑机控制器系统数据,数据分为三种类型:第一类设备运行状态(生产,待机)。第二类:spc监测数据(监测机器的每个参数,如:生产数量&#xff…

作者头像 李华
网站建设 2026/8/14 14:39:21

毕设分享 深度学习动物识别系统(源码+论文)

文章目录 0 前言1 项目运行效果1 背景2 算法原理2.1 动物识别方法概况2.2 常用的网络模型2.2.1 B-CNN2.2.2 SSD 3 SSD动物目标检测流程4 实现效果5 部分相关代码5.1 数据预处理5.2 构建卷积神经网络5.3 tensorflow计算图可视化5.4 网络模型训练5.5 对猫狗图像进行2分类 6 最后 …

作者头像 李华