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

【C++】STL库_list 的模拟实现

        list可以看作是双向循环链表,list跟前面的vector和string使用方法大多相同,这里主要是模拟实现。

        因为底层为链表的数据结构,是非线性的,所以其迭代器不能使用原生指针,要重新定义迭代器的操作,而这部分是很重要的。


 一、list 部分函数

                 转移数据,把后一个链表数据转移到前另一个链表

        删除指定数据

        数据去重

        用list操作去重操作,效率并不高,后面又更高效的去重类型。

        排序 

        list 底层使用的是归并排序,不用消耗额外的空间。默认是升序,可以改。

二、模拟实现 list

        list 包含了类和对象的很多基本要点,要是类和对象不熟悉的话,学和写都会比较困难,难以理解。

        首先这里把节点、链表、迭代器,分成了三个部分来写。

节点:

//节点
template<class T>
class list_node
{
public:
	T _data;
	list_node<T>* _next;
	list_node<T>* _pre;

	//拷贝构造
	list_node(const T& x = T())
		:_data(x)
		, _next(nullptr)
		, _pre(nullptr)
	{
	}
};

        这里链表节点的写法没什么要点,跟 前面C语言链表节点的写法大同小异。因为不知道节点具体存储的什么数据,所以这里使用了模板,使其变的更为灵活。

迭代器:

//迭代器
template<class T>
struct __list_iterator
{
	typedef list_node<T> Node;
	//缩减一下长度
	typedef __list_iterator<T> iterator;

	Node* _node;
}

链表:

链表
template<class T>
class list
{
	typedef list_node<T> Node; 

public:
	typedef __list_iterator<T, T&, T*> iterator;
private:
    Node* _head ; //哨兵位的头节点
}

http://www.dtcms.com/a/85688.html

相关文章:

  • 三个print优雅打印datetime模块的“时间密码”
  • 笔试专题(二)
  • Rust函数、条件语句、循环
  • 动态查找表
  • 1.2 编译器结构
  • 把 ASP.NET Core 服务(BigDogServer)部署到 Linux 并作为服务运行
  • 一文读懂 GPT 与 BERT:预训练逻辑及差异剖析
  • 缓存过期时间之逻辑过期
  • 蓝桥备赛(25)算法篇【差分】
  • word文件转换为Markdown格式
  • 关于极端场景下,数据库更新与 MQ 消息一致性保障方案的详细总结
  • Qt信号与槽高级特性与项目实战:原理剖析与工程化应用指南
  • 20250330 Pyflink with Paimon
  • rocky linux下载软件
  • [Python]代理批量检测延迟工具
  • ChatTTS:对话场景语音合成的开源新星
  • 《量子密码》
  • CSS3学习教程,从入门到精通,CSS3 图像属性知识点及案例代码(16)
  • 如何获取thinkphp的所有发行版本
  • 运行时智控:PanLang 开发者指南(一)运行时系统核心模块实现——PanLang 原型全栈设计方案与实验性探索5
  • 单链表中的递归算法
  • 编译原理——词法分析
  • GD32 ARM单片机开发规范检查清单 GD32嵌入式C代码检查清单
  • 《TypeScript 类的艺术:高效编码指南》
  • TransformersInternLM源码阅读
  • 括弧匹配检验(信息学奥赛一本通-1354)
  • Cherry Studio搭建本地知识库,结合DeepSeek实现RAG
  • AM32-MultiRotor-ESC项目固件编译和烧录方法介绍
  • 【Spring】Spring框架介绍
  • C/C++蓝桥杯算法真题打卡(Day7)