ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

C++之list模拟实现

2026/8/6 17:02:33 拓冰建站 浏览量
C++之list模拟实现 一.介绍list同vector一样都是容器list底层双向循环链表由前驱指针、后继指针和数据组成与vector不同于不是连续内存vector是连续数组。优点任意位置插入删除元素时间复杂度为O1erase删除时仅仅被删除的节点迭代器失效其余迭代器依旧有效缺点不支持下标访问遍历效率低二.list实现1.list构造函数2.list iterator此处begin和end为正向迭代器反向还莫有学可进行操作迭代器向后移。swap交换先给自己一个头指针再把需要交换的头指针给 给创建好的头指针再把临时对象tmp的新头指针给原来的完成交换。为什么会有list类和list iterator类list容器管整块链表数据迭代器iterator专门管单个节点的访问、遍历分工完全不一样必须拆成两个类后者掌管1. 重载 * 解引用 *it 取出节点里存储的数据T2. 重载 前置/后置自增 it 跳到下一个节点 _pNode _pNode-_pNext3. 重载 -- 自减往前遍历上一个节点4. 重载 ! 判断两个迭代器是否指向同一个节点为什么要重载--相较于vector它空间是连续的1. vector迭代器本质就是封装的原生T*指针vector内存连续原生指针天然支持 、 -- 、 n 、 [] 随机偏移指针自增直接跳到下一个相邻元素。所以不用手动重载 operator 、 operator-- 直接复用原生指针自带的运算规则即可。2. list不能用裸指针做迭代器必须手动重载所有运算符list节点零散分布在堆上前后节点内存地址并不挨着。单纯对节点Node*做 只会走到这块内存后面随机地址找不到下一个链表节点。只能手动写重载一、为啥三个模板参数1. T 链表存的数据类型2. Ref 引用、 Ptr 指针用来一套代码做出两种迭代器- 普通迭代器 RefT、PtrT* 能读写数据- const迭代器 Refconst T、Ptrconst T* 只能读不能改不用写两份重复代码省事。3. Self 给自己这个迭代器类起短别名少写长名字。二、各个函数为啥对应不同类型1. Ref operator*() 解引用取值用Ref控制能不能修改元素2. Ptr operator-() 箭头访问成员用Ptr控制读写权限3. 拷贝构造、运算符用 Self 指代迭代器本身类型书写简单方便链式运总代码