当前位置: 首页 > 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 ; //哨兵位的头节点
}

相关文章:

  • 三个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
  • 《沙尘暴》:用贴近生活的影像和表演拍摄悬疑剧
  • 【社论】用生态环境法典守护生态文明
  • 马上评丨发钱奖励结婚,支持婚育就该系统性发力
  • QFII一季度现身超300家公司:持有南京银行市值最高,5家青睐立航科技
  • 央媒谈多地景区试水“免费开放”:盲目跟风会顾此失彼
  • 利用AI捏造“天价骨灰盒”谣言,内蒙古包头一网民被行政处罚