C++ list容器模拟实现:迭代器、构造与STL风格编程 list的模拟实现1.1 list基本结构list的结构是个带头双向循环链表每个数据是存储在一个单独的节点内这个节点除了存储数据还有两个指针分别指向前一个和后一个节点这里定义节点的类用struct定义list的类用class的原因是一个默认的共识一个类如果它的所有成员都不期望用访问限定符限制的时候习惯上就用struct定义这里的list_node通常作为链表的一个子结构是存储每个数据的一个最小单元链表内是要大量访问内部数据的所以这里不用访问限定符限制。虽然这样写后别人就可以随便访问这些结构了但是有迭代器之后在外层的角度是看不到节点的例如从使用的角度在接口使用的时候是不用链表的节点的无论是访问修改还是插入删除都是直接用迭代器的即虽然list_node是公有的但是其是一种隐形的封装平时看不到也不会/不需要访问这里 list_node T * _prev; 这个写法是C 模板语法 指针语法的组合list_node T 是语法规定 list_node是定义的模板结构体C 语法要求使用模板类 / 结构体时必须通过模板参数指定具体的泛型类型这里T是模板参数所以list_node T 是模板结构体的 “实例化类型写法”属于语法强制要求。*是语法规定*是 C 中 “指针类型” 的声明符号list_node T *表示 “指向list_node T 类型对象的指针”这是指针的标准语法。补充一下这里模板声明的作用范围模板声明的作用范围template class T 是 “模板参数声明”它的作用域仅限于紧跟在它后面的那个类或结构体、函数。例如代码语言javascriptAI代码解释// 第一个类模板list_node templateclass T // 作用范围下面的 struct list_node struct list_node { ... }; // 第二个类模板list templateclass T // 作用范围下面的 class list class list { ... };这里的两个 template class T 是独立的分别服务于 list_node 和 list 两个类彼此不影响。新类模板需要重新声明每个类模板都是独立的实体即使两个类的功能相关比如链表的节点和链表本身定义新的类模板时也必须重新写template class T 。原因是模板参数 T 是 “当前类模板的局部参数”只在当前类的范围内有效。比如 list_node 中的 T 和 list 中的 T 虽然名字相同但实际上是两个独立的模板参数只是习惯上用相同的字母表示。特殊情况嵌套类模板如果一个类模板内部嵌套了另一个类嵌套类可以直接使用外部类的模板参数无需重复声明代码语言javascriptAI代码解释templateclass T class outer { // 嵌套类直接使用外部的 T class inner { T data; // 这里的 T 继承自 outer 的 templateclass T }; };但如果嵌套类需要自己的独立模板参数比如同时支持 T 和 U则需要单独声明代码语言javascriptAI代码解释templateclass T class outer { // 嵌套类有自己的模板参数 U templateclass U // 单独声明作用范围下面的 inner class inner { T a; // 来自 outer 的 T U b; // 来自 inner 自己的 U }; };1.2 构造 尾插在这里插入图片描述尾插逻辑如图在这里插入图片描述在这里插入图片描述这里运行不了运行不了的原因是list_node 缺少无参构造函数 在 List.h 中list_node 结构体的构造函数只有带参数的版本list_node(const T x)但没有无参构造函数。 而在 list 类的构造函数中执行了 _head new Node; —— 这里尝试调用 list_node 的无参构造函数但该构造函数并不存在因此会触发编译错误。这里有三种解决办法方法 1利用list_node的带参构造显式传入默认值在 list 类的构造函数中创建头结点时显式调用 list_node 的带参构造并传入 T 类型的默认值通过 T() 触发 T 的默认构造也就是使用匿名对象T有可能是任意类型。这样无需为 list_node 新增无参构造函数。

相关新闻

最新新闻

智能计算系统课程设计实战:从模型训练到边缘部署全流程指南

智能计算系统课程设计实战:从模型训练到边缘部署全流程指南

简介:边缘计算正成为AI落地的重要场景,而将深度学习模型高效部署到资源受限的设备上,是工程师必须掌握的核心技能。本文从模型训练、格式转换、量化压缩到硬件部署,系统梳理了智能计算系统课程设计中的完整链路。通过PyTorch导出O…

2026/8/26 23:52:20
测试工程师笔试:用例设计大题解析与实战技巧

测试工程师笔试:用例设计大题解析与实战技巧

1. 用例设计笔试大题解析的价值与定位 刚入行测试工程师那会儿,最让我头疼的就是笔试环节的用例设计大题。这些题目往往看似简单,却暗藏玄机——它们不仅考察基础测试理论,更检验实际业务场景的抽象能力和系统思维。记得第一次面试时&#xf…

2026/8/26 23:52:20
触觉感知与力控操作:从摸麻将到挤牙膏的机器人技能学习

触觉感知与力控操作:从摸麻将到挤牙膏的机器人技能学习

这次我们来看一个机器人操作技能学习方向的典型进展:让机器人“摸麻将”“挤牙膏”。乍看像是生活小实验,其实背后是具身智能里非常关键的触觉感知与力控操作问题。机器人如果只能靠视觉识别物体,很难完成需要“手感”的任务——麻将牌的厚度…

2026/8/26 23:52:20
AI厨天才CR3深度解析:全自主颠勺与蒸汽自清洁,烹饪机器人为何难在动作控制

AI厨天才CR3深度解析:全自主颠勺与蒸汽自清洁,烹饪机器人为何难在动作控制

看到“AI厨天才CR3”这个名字,我最先注意到的不是“AI”,也不是“厨天才”,而是“颠勺”两个字。过去几年,消费级烹饪机器人并不少,但绝大多数做的事情,是把搅拌、加热、时间控制这些环节集成到一个锅里&am…

2026/8/26 23:52:19
LoRaWAN设备接入MachineQ:从入网到数据上云实战指南

LoRaWAN设备接入MachineQ:从入网到数据上云实战指南

写这个LoRa系列写到现在,已经花了不少篇幅去聊调制原理、LoRaWAN协议栈、网关选型,也带着大家把开发板上的数据跑通过。前面几篇偏“地基”,这一篇终于要面对一个非常实际的问题:当设备数量超过十几个,当你要从纯实验环…

2026/8/26 23:52:19
时序攻击在访问控制中的应用:原理、检测与防御实战

时序攻击在访问控制中的应用:原理、检测与防御实战

在某个内部系统的授权测试里,我盯着 Burp 的响应时间一栏,发现两个返回状态完全相同的接口,响应时间却稳定差了 200 毫秒。那一次的经历让我彻底改掉了“只看状态码、不关心耗时”的习惯。所谓时序攻击(Timing Attacks&#xff09…

2026/8/26 23:47:19