首页 > 编程语言 >C++list实现

C++list实现

时间:2024-03-15 21:29:24浏览次数:22  
标签:node head const iterator 实现 list C++ return

长话短说,我们直接实现。

#pragma once
#include <assert.h>
namespace cx
{
	template <class T>
	struct ListNode
	{
		//构造函数
		ListNode(const T& x=T())
			:_next(nullptr),_prev(nullptr),_val(x)
		{}
		//成员变量:
		ListNode<T>* _next;
		ListNode<T>* _prev;
		T _val;
	};
	template <class T,class Ref,class Ptr>
	//template <class T, class Ref>
	struct _list_iterator
	{
		typedef ListNode<T> Node;
		typedef _list_iterator<T,Ref, Ptr> self;
		//typedef _list_iterator<T, Ref> self;

		//构造函数:
		//_list_iterator()
		/*iterator(Node* x)
			:_node(x)
		{}*/
		_list_iterator(Node* x)
			:_node(x)
		{}
		//不用写析构:原因在于我们的目标不是在这里析构
		//常见操作:		
		self& operator++()//前置++
		{
			_node = _node->_next;
			return (*this);
		}
		self operator++(int)//后置++
		{
			self tmp(*this);
			_node = _node->_next;
			return tmp;
		}
		self& operator--()//前置--
		{
			_node = _node->_prev;
			return *this;
		}
		self& operator--(int)//后置--
		{
			self tmp(*this);
			_node = _node->_prev;
			return tmp;
		}
		Ref operator*()
		{
			return _node->_val;
		}
		bool operator!=(const self& s)
		{
			return !(_node == s._node);
		}
		bool operator==(const self& s)
		{
			return !(*this != s);
		}
		Ptr operator->()
		{
			return &_node->_val;
		}
		//类成员函数:
		Node* _node;
	};
	//template <class T>
	//struct _list_const_iterator
	//{
	//	typedef ListNode<T> Node;
	//	typedef _list_const_iterator<T> const_iterator;
	//	//构造函数:
	//	//_list_iterator()
	//	/*iterator(Node* x)
	//		:_node(x)
	//	{}*/
	//	_list_const_iterator(Node* x)
	//		:_node(x)
	//	{}
	//	//不用写析构:原因在于我们的目标不是在这里析构
	//	//常见操作:		
	//	const_iterator& operator++()//前置++
	//	{
	//		_node = _node->_next;
	//		return (*this);
	//	}
	//	const_iterator operator++(int)//后置++
	//	{
	//		const_iterator tmp(*this);
	//		_node = _node->_next;
	//		return tmp;
	//	}
	//	const_iterator& operator--()//前置--
	//	{
	//		_node = _node->_prev;
	//		return *this;
	//	}
	//	const_iterator& operator--(int)//后置--
	//	{
	//		const_iterator tmp(*this);
	//		_node = _node->_prev;
	//		return tmp;
	//	}
	//	const T& operator*()
	//	{
	//		return _node->_val;
	//	}
	//	bool operator!=(const const_iterator& s)
	//	{
	//		return !(_node == s._node);
	//	}
	//	bool operator==(const const_iterator& s)
	//	{
	//		return !(*this != s);
	//	}
	//	//类成员函数:
	//	Node* _node;
	//};
	template <class T>
	class list
	{
	public:
		typedef ListNode<T> Node;
		//typedef _list_iterator<T,T&> iterator;
		typedef _list_iterator<T, T&, T*> iterator;
		//typedef _list_iterator<T, const T&> const_iterator;
		typedef _list_iterator<T,const T&,const T*> const_iterator;
		//构造函数
		void empty_list()
		{
			_head = new Node;
			_head->_next = _head;
			_head->_prev = _head;
		}
		list()
		{
			empty_list();
		}
		//list ( list& x);
		list(const list<T>& s)
		{
			empty_list();
			for (auto e : s)//该类型为:T
			{
				push_back(e);
			}
		}
		//list& operator= (const list& lt);
		//传统写法:
		//list<T>& operator= (list<T>& lt)
		//{
		//	if(this != &lt)
		//	{
		//		//清除*this中内容
		//		clear();
		//		for (T e : lt)
		//		{
		//			push_back(e);
		//		}
		//	}
		//	return *this;
		//}
		//现代写法:
		list<T>& operator= (list<T> lt)
		{
			swap(lt);
			return *this;
		}
		//析构函数:
		void clear()
		{
			//区别析构函数,clear只会删除有效数据,保留虚拟头结点
			iterator it = begin();
			while (it != end())
			{
				it=erase(it);
			}
		}
		~list()
		{
			clear();
			//删除_head;
			delete _head;
			_head = nullptr;
		}
		//迭代器:
		iterator begin()//有效第一个节点
		{
			//assert(_head->_next != _head);
			//如果写上面这句,会出现开始为空链表报错情况
			return _head->_next;
		}
		const_iterator begin() const
		{
			return _head->_next;
		}
		iterator end()
		{
			return _head;
		}
		const_iterator end() const
		{
			return _head;
		}
		//常见操作:
		iterator erase(iterator pos)
		{
			//检查pos位置非_head位置
			assert(pos !=end());
			//删除的是pos位置
			Node* current = pos._node;
			Node* prev = current->_prev;
			Node* next = current->_next;
			//删除操作
			prev->_next = next;
			next->_prev = prev;
			delete current;
			return next;//返回的是pos下一个位置
		}
		iterator erase(iterator first, iterator last)//区间左闭右开
		{
			assert(first != end());
			assert(last != end());
			while (first != last)
			{
				if (first == end())
					break;
				first = erase(first);
			}
			return first;
		}
		void push_back(const T& val)
		{
			Node* tmp = new Node(val);
			Node* tail = _head->_prev;
			tail->_next = tmp;
			tmp->_prev = tail;
			tmp->_next = _head;
			_head->_prev = tmp;
		}
		void swap(list<T>& tmp)
		{
			std::swap(_head, tmp._head);
		}
		iterator insert(iterator pos, const T& x)
		{
			//insert是指在pos位置前插入
			Node* current = pos._node;
			Node* prev = current->_prev;
			//开空间
			Node* tmp = new Node(x);
			tmp->_prev = prev;
			prev->_next = tmp;
			tmp->_next = current;
			current->_prev = tmp;
			//return iterator(tmp);
			return tmp;//注意点:单参数的类可以隐式类型转换
		}
		//容量相关:
		bool empty() const
		{
			return _head->_next == _head;
		}
		size_t size() const
		{
			size_t n = 0;
			Node* tmp = _head->_next;
			while (tmp!=_head)
			{
				tmp = tmp->_next;
				n++;
			}
			return n;
		}
		void push_front(const T& x)
		{
			this->insert(begin(), x);
		}
		void pop_back()
		{
			this->erase(--end());
		}
		void pop_front()
		{
			erase(begin());
		}
		//Element access:
		T& front()
		{
			return _head->_next->_val;
		}
		const T& front() const
		{
			return _head->_next->_val;
		}
		T& back()
		{
			return _head->_prev->_val;
		}
		const T& back() const
		{
			return _head->_prev->_val;
		}
	private:
		//虚拟头结点:
		Node* _head;
	};
}

大家可以自行添加更多内容~

标签:node,head,const,iterator,实现,list,C++,return
From: https://blog.csdn.net/2301_79813267/article/details/136697703

相关文章

  • 深度学习入门基于python的理论与实现-第三章神经网络
    目录激活函数阶跃函数sigmoid函数ReLU函数三层神经网络的实现输出层设计恒等函数和softmax函数输出层的神经元数量手写数字识别MINIST数据集神经网络的推理处理批处理激活函数激活函数是连接感知机和神经网络的桥梁阶跃函数阶跃函数是在感知机中使用的激活函数。\[h(x)=\begi......
  • c++ 画规律画
     1#include<iostream>2usingnamespacestd;3intmain(intargc,char**argv){4intn;5cin>>n;6//三角7for(inti=1;i<=n;i++){8for(intt=1;t<=n-i;t++){9cout<<"";......
  • python实现数据下钻,数据地图可视化,得到每个地区的项目数量
    具体代码frompyecharts.chartsimportMapfrompyechartsimportoptionsasoptsfrompyecharts.globalsimportThemeTypeimporturllib.request,urllib.parse,urllib.errorimportjsonimporthashlibimportnumpyasnpimportpandasaspdMyAK='sIWgaZ4yp......
  • Python实战:Python列表(List)详解及其常用方法
    本文将详细介绍Python中的列表(List)数据结构,包括其基本概念、特点、常用方法以及实际应用案例。我们将深入探讨列表的内部实现机制,并通过丰富的代码示例来展示如何高效地使用列表来解决各种编程问题。1.引言在Python中,列表(List)是最常用的数据结构之一,它提供了一种灵活......
  • QT TreeWidget控件实现文件树 展示目录结构
    目录1、获取盘符,以及一级子文件2、getFileOnDirectory函数,遍历指定文件夹的一级子文件3、绑定展开信号和槽函数,遍历指定文件4、QTreeWidgetItem::setData()用法如图所示,这里仅仅实现展示目录结构,对于新增文件、修改文件、删除文件会后续补充。 思路:这里我并没有在程序......
  • 大规模C++程序设计 -- 基础知识
    基础知识我们先回顾C++程序语言和面向对象分析的一些重要的方面,这些知识对于大型系统设计来说是基本的。我们仔细分析多文件程序、声明与定义,以及在头文件和实现文件上下文中的内部链接和外部链接,然后研究typedef和assert的使用。多文件C++程序对于所有的(除了最小的)程序来说,将......
  • 计算机毕业设计项目基于大数据和ALS算法实现的房源智能推荐系统
    概要  目前,现有的房源信息不够透明化大多中介混淆市场,内含不为人知的商业链。有经验的租客们会通过周边房价走势和走访周边房源对比调研、筛选适合自己的房源。同时,对于用户工作地点需求和各种人群类型如大学生群体,年轻小资,或者中年人,他们希望居住的环境要求各不相同各......
  • Qt 工具盒类实现QQ界面QToolBox
    实例:MyQQ界面新建:QtWidgetsApplication项目名称:MyQQ类名:Dialog基类:QDialog不选择“创建界面”代码及详细注释如下:【main.cpp】1#include"dialog.h"//使用哪个类就必须把包含该类的头文件引用过来(*.h文件中包含了相应类的定义)2#include<QAppli......
  • cdkdroplist,调整button排序和位置问题
    buttonenhancement;简单做个记录,给自己看的哈哈!!!应用场景由于cdkdroplist多行时的item移动难用的一批,跟需求讨论决定搞成单行的滚动条;好了开干,玩的就是真实。item少的时候就不说了,正常。当item多时需要滚动,开始操作:超出文本滚动,不换行...等等,原本根据配置的居左居右咋办。原......
  • 【Flink】Flink 使用 JobListener 监听 任务状态
    1.概述flink程序运行起来,需要获取flink的任务状态,我们有几种方式获取。使用yarn命令或者,查看任务状态使用flink指标监控查看flink任务状态使用JobListener监听任务状态下面我们来主要介绍如何使用JobListener监听任务状态。2.使用JobListener的使用很简单,我们只需......