list库实现

list库实现的要点:

构建list类时,需要同时构建struct Node来存储节点信息,list类中只存储哨兵位节点信息,迭代器类需要template<T,Ptr,Ref>来构建const和非const迭代器,迭代器中也是存储节点信息。反向迭代器也是同样道理,但是可以用迭代器来构建反向迭代器。具体代码如下 

#include<iostream>
#include<assert.h>
#include<algorithm>
using namespace std;

template<class T>
struct __list_node
{
	__list_node(const T& val = T())
		:_data(val)
		,_prev(nullptr)
		,_next(nullptr)
		{}

	__list_node* _prev;
	__list_node* _next;
	T _data;
};//构建每个节点

//构建迭代器struct
template<class T, class Ptr, class Ref>
struct __list_iterator
{
	typedef __list_node<T> Node;
	typedef __list_iterator<T, Ptr, Ref> Self;
	Node* _node;//成员变量还是节点,只是在成员函数做手脚
	__list_iterator(Node* val )
		:_node(val)
	{}
	
	Self& operator++()
	{
		_node = _node->_next;
		return *this;
	}
	Self operator++(int)//后置
	{
		Self tmp = *this;
		++(*this);
		return tmp;
	}
	Self& operator--()
	{
		_node = _node->_prev;
		return *this;
	}
	Self operator--(int)
	{
		Self tmp = *this;
		--(*this);
		return tmp;
	}
	
	Ptr operator->()
	{
		return &(_node->_data);
	}
	Ref operator*()
	{
		return _node->_data;
	}
	bool operator!= ( const Self& val )
	{
		return !(_node == val._node);
	}


};
template<class T,class Ptr,class Ref>
struct __list_reverse_iterator
{
	typedef __list_iterator<T, T*, T&> iterator;
	typedef __list_reverse_iterator<T, T*, T&> Self;
	iterator _it;
	__list_reverse_iterator(iterator it)
		:_it(it)
	{}
	Self operator++()
	{
		_it = _it._node->_prev;
		return *this;
	}
	T& operator*()
	{
		return _it._node->_data;
	}
	bool operator!=(const Self& rit)
	{
		return !(_it._node == rit._it._node);
	}
	
};

//构建双向带头循环链表
template<class T>
class list
{
	typedef __list_node<T> Node;
public:
	typedef __list_iterator<T,T*,T&> iterator;
	typedef __list_iterator<T, const T*, const T&> const_iterator;
	typedef __list_reverse_iterator<T, T*, T&> reverse_iterator;
	reverse_iterator rbegin()
	{
		return reverse_iterator(--end());
	}
	reverse_iterator rend()
	{
		return reverse_iterator(end());
	}
	iterator begin()
	{
		return iterator(_phead->_next);
	}
	const_iterator begin()const
	{
		return const_iterator(_phead->_next);
	}
	iterator end()
	{
		return iterator(_phead);
	}
	const_iterator end()const
	{
		return const_iterator(_phead);
	}

	list()//开头空间,初始化
	{
		_phead = new Node;
		_phead->_next = _phead;
		_phead->_prev = _phead;
	}
	~list()
	{
		clear();
		delete _phead;
		_phead = nullptr;
	}
	//拷贝构造(先创建一个哨兵位,然后再pushback)
	list(const list<T>& l)
	{
		_phead = new Node;
		_phead->_next = _phead;
		_phead->_prev = _phead;
		for (auto& x : l)
		{
			push_back(x);
		}
	}
	list<T>& operator=(const list<T>& l)
	{
		list<T> tmp(l);
		swap(_phead, tmp._phead);
		return *this;
	}

	//尾插入
	void push_back(const T& val)
	{
		//Node* tail = _phead->_prev;
		//Node* newnode = new Node(val);
		更变链接
		//tail->_next = newnode;
		//newnode->_prev = tail;
		//newnode->_next = _phead;
		//_phead->_prev = newnode;
		insert(end(), val);
	}
	//头插
	void push_front(const T& val)
	{
		insert(begin(), val);
	}
	//头删除
	void pop_front()
	{
		erase(begin());
	}
	//尾删除
	void pop_back()
	{
		erase(--end());
	}
	//清空节点(除了哨兵位,都清除)
	void clear()
	{
		iterator it = begin();
		while (it != end())
		{
			it = erase(it);
		}
	}
	//随机插入
	void insert(iterator pos, const T& val)
	{
		Node* pcur = pos._node;
		Node* prev = pcur->_prev;
		Node* newnode = new Node(val);
		//构建联系
		newnode->_prev = prev;
		newnode->_next = pcur;
		prev->_next = newnode;
		pcur->_prev = newnode;
		
	}
	//删除指定位置(不能将哨兵位删掉!!
	iterator erase(iterator pos)
	{
		assert(pos != end());
		Node* pcur = pos._node;
		Node* prev = pcur->_prev;
		Node* next = pcur->_next;
		delete pcur;
		pcur = nullptr;
		prev->_next = next;
		next->_prev = prev;
		return iterator(next);
	}

private:
	Node* _phead;
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/889316.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用Pytorch+Numpy+Matplotlib实现手写字体分类和图像显示

文章目录 1.引用2.内置图片数据集加载3.处理为batch类型4.设置运行设备5.查看数据6.绘图查看数据图片(1)不显示图片标签(2)打印图片标签(3)图片显示标签 7.定义卷积函数8.卷积实例化、损失函数、优化器9.训练和测试损失、正确率(1)训练(2)测试(3)循环(4)损失和正确率曲线(5)输出…

Spark_累加器

分布式共享只写变量 实现原理&#xff1a;  累加器用来把Executor端变量信息聚合到Driver端&#xff0c;在Driver程序中定义的变量&#xff0c;在Executor端的每个Task都会得到这个变量的一份新的副本&#xff0c;每个task更新这些副本的值后&#xff0c;传回Driver端进行mer…

执行node.js获取本机Ip命令,报:Error: Cannot find module ‘ip‘错误

Error: Cannot find module ip是由于没有改模块的依赖包&#xff0c;需要进行安装&#xff0c;以管理员的身份打开命令行&#xff0c;执行npm install ip 获取当前电脑的ip地址 方法一&#xff1a; const ip require("ip")/*** 1:获取当前电脑的ip地址*/ console.…

PPT技巧:保护PPT文件的方法有哪些?

PPT文件制作好之后保证文件不出错应该是很重要的&#xff0c;毕竟是要拿出去展示的&#xff0c;今天分享PPT加密方法给大家。希望能够帮助大家保护好自己的PPT文件。 打开密码 如果想要其他人需要输入正确的密码才能够打开文件查看并编辑&#xff0c;我们可以给PPT文件设置打…

Github优质项目推荐 - 第六期

文章目录 Github优质项目推荐 - 第六期一、【WiFiAnalyzer】&#xff0c;3.4k stars - WiFi 网络分析工具二、【penpot】&#xff0c;33k stars - UI 设计与原型制作平台三、【Inpaint-Anything】&#xff0c;6.4k stars - 修复图像、视频和3D 场景中的任何内容四、【Malware-P…

gitee开源商城diygw-mall

DIYGW可视化开源商城系统。所的界面布局显示都通过低代码可视化开发工具生成源码实现。支持集成微信小程序支付。 DIYGW可视化开源商城系统是一款基于thinkphp8 framework、 element plus admin、uniapp开发而成的前后端分离系统。 开源商城项目源码地址&#xff1a;diygw商城…

stm32定时器中断和外部中断

一&#xff0c;中断系统的介绍 中断&#xff1a;在主程序运行过程中&#xff0c;出现了特定的中断触发条件&#xff08;中断源&#xff09;&#xff0c;使得CPU暂停当前正在运行的程序&#xff0c;转而去处理中断程序&#xff0c;处理完成后又返回原来被暂停的位置继续运行 中…

知识图谱入门——7:阶段案例:使用 Protégé、Jupyter Notebook 中的 spaCy 和 Neo4j Desktop 搭建知识图谱

在 Windows 环境中结合使用 Protg、Jupyter Notebook 中的 spaCy 和 Neo4j Desktop&#xff0c;可以高效地实现从自然语言处理&#xff08;NLP&#xff09;到知识图谱构建的全过程。本案例将详细论述环境配置、步骤实现以及一些扩展和不足之处。 源文件已上传我的资源区。 文章…

【深海王国】初中生也能画的电路板?目录合集

Hi٩(๑ ^ o ^ ๑)۶, 各位深海王国的同志们&#xff0c;早上下午晚上凌晨好呀~辛勤工作的你今天也辛苦啦 (o゜▽゜)o☆ 今天大都督为大家带来系列文章《初中生也能画的电路板》&#xff0c;帮你一周内快速入门PCB设计&#xff0c;手把手教你从元器件库添加、电路原理图绘制、…

初阶C语言-结构体

一.结构体的声明 1.结构体类型的声明 1.1结构的基础知识 结构是一些值的集合&#xff0c;这些值称为称为变量。结构的每个成员可以是不同类型的变量。 1.2结构的声明 struct tag //struct是结构体关键字&#xff0c;tag是结构体类型名称 { member - list;//成员变…

minio集群部署

最近接触到minio&#xff0c; 将本地集群部署&#xff0c;分别在ubuntu、centos stream9上进行了搭建&#xff0c;目前看里面的小坑不小&#xff0c;记录以下教程&#xff0c;以备忘、以供他人借鉴。 #### 准备 1、因新版本的minio要求&#xff0c;集群部署必须使用挂载非 roo…

AAA Mysql与redis的主从复制原理

一 &#xff1a;Mysql主从复制 重要的两个日志文件&#xff1a;bin log 和 relay log bin log&#xff1a;二进制日志&#xff08;binnary log&#xff09;以事件形式记录了对MySQL数据库执行更改的所有操作。 relay log&#xff1a;用来保存从节点I/O线程接受的bin log日志…

Java中System类和RunTime类的Api

目录 System 类 1)out 2)err 3)in 4)currentTimeMillis() 5)nanoTime() 6)arraycopy(Object 要从里面复制东西的数组, int 要从里面复制东西数组的索引起始位置, Object 获得复制元素的数组, int 获得复制元素数组的起始索引, int 要复制东西的个数) 7)gc() 8)exit(int status)…

51单片机的无线通信智能车库门【proteus仿真+程序+报告+原理图+演示视频】

1、主要功能 该系统由AT89C51/STC89C52单片机LCD1602显示模块红外传感器光照传感器时钟模块步进电机蓝牙按键、LED、蜂鸣器等模块构成。适用于智能车库自动门、无线控制车库门等相似项目。 可实现功能: 1、LCD1602实时显示北京时间和自动/手动模式&#xff0c;以及验证是否成…

【Arduino IDE安装】Arduino IDE的简介和安装详情

目录 &#x1f31e;1. Arduino IDE概述 &#x1f31e;2. Arduino IDE安装详情 &#x1f30d;2.1 获取安装包 &#x1f30d;2.2 安装详情 &#x1f30d;2.3 配置中文 &#x1f30d;2.4 其他配置 &#x1f31e;1. Arduino IDE概述 Arduino IDE&#xff08;Integrated Deve…

使用 Go 和 Gin 框架构建简单的用户和物品管理 Web 服务

使用 Go 和 Gin 框架构建简单的用户和物品管理 Web 服务 在本项目中&#xff0c;我们使用 Go 语言和 Gin 框架构建了一个简单的 Web 服务&#xff0c;能够管理用户和物品的信息。该服务实现了两个主要接口&#xff1a;根据用户 ID 获取用户名称&#xff0c;以及根据物品 ID 获…

模拟实现消息队列(基于SpringBoot实现)

项目代码 提要&#xff1a;此处的消息队列是仿照RabbitMQ实现&#xff08;参数之类的&#xff09;&#xff0c;实现一些基本的操作&#xff1a;创建/销毁交互机&#xff08;exchangeDeclare&#xff0c;exchangeDelete&#xff09;&#xff0c;队列&#xff08;queueDeclare&a…

【电路笔记】-求和运算放大器

求和运算放大器 文章目录 求和运算放大器1、概述2、反相求和放大器3、同相求和放大器4、减法放大器5、应用5.1 音频混合器5.2 数模转换器 (DAC)6、总结1、概述 在我们之前有关运算放大器的大部分文章中,仅将一个输入应用于反相或非反相运算放大器的输入。在本文中,将讨论一种…

Python:条件分支 if 语句全讲解

Python&#xff1a;条件分支 if 语句全讲解 如果我拿出下面的代码&#xff0c;阁下该做何应对&#xff1f; if not reset_excuted and (terminated or truncated):... else:...---- 前言&#xff1a; 消化论文代码的时候看到这个东西直接大脑冻结&#xff0c;没想过会在这么…

5个免费ppt模板网站推荐!轻松搞定职场ppt制作!

每次过完小长假&#xff0c;可以明显地感觉到&#xff0c;2024这一年很快又要结束了&#xff0c;不知此刻的你有何感想呢&#xff1f;是满载而归&#xff0c;还是准备着手制作年终总结ppt或年度汇报ppt呢&#xff1f; 每当说到制作ppt&#xff0c;很多人的第一反应&#xff0c…