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

C++学习:list模拟实现

一:结点

这次结构有点多 但并不复杂

template<class T>
	struct list_node
	{
		T _data;
		list_node<T>* _next;
		list_node<T>* _prev;

		list_node(const T& x = T())
			:_data(x)
			,_next(nullptr)
			,_prev(nullptr)
		{}
	};

二:迭代器

别看传了三个参数,其实就是T T& T* 你就只想传一个也可以 咱只是为了让两种迭代器能用一套代码而已。

    // T T& T* 
	// T cosnt T& const T*
	template<class T, class Ref, class Ptr>
	struct __list_iterator
	{
		typedef list_node<T> Node;
		typedef __list_iterator<T, Ref, Ptr> self;
		Node* _node;

		__list_iterator(Node* node)
			:_node(node)
		{}

		self& operator++()
		{
			_node = _node->_next;
			return *this;
		}

		self& operator--()
		{
			_node = _node->_prev;
			return *this;
		}

		self operator++(int)
		{
			self tmp(*this);
			_node = _node->_next;

			return tmp;
		}

		self operator--(int)
		{
			self tmp(*this);
			_node = _node->_prev;

			return tmp;
		}

		Ref operator*()
		{
			return _node->_data;
		}

		Ptr operator->()
		{
			return &_node->_data;
		}

		bool operator!=(const self& s)
		{
			return _node != s._node;
		}

		bool operator==(const self& s)
		{
			return _node == s._node;
		}
	};

三:list

这里就没啥好说了和链表差不多的 最后和上面的都包到你的命名空间里就行

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;

		const_iterator begin() const
		{
			return const_iterator(_head->_next);
		}

		const_iterator end() const
		{
			return const_iterator(_head);
		}

		iterator begin()
		{
			//return iterator(_head->_next);
			return _head->_next;//隐私类型转换
		}

		iterator end()
		{
			//return iterator(_head->_next);
			return _head;
		}

		void empty_init()
		{
			_head = new Node;
			_head->_next = _head;
			_head->_prev = _head;

			_size = 0;
		}

		list()
		{
			empty_init();
		}

		list(const list<T>& lt)
		{
			empty_init();
			for (auto e : lt)
			{
				push_back(e);
			}
		}

		
		

		void swap(list<T>& lt)
		{
			std::swap(_head, lt._head);
			std::swap(_size, lt._size);
		}

		
		list<int>& operator=(list<int> lt)
		{
			swap(lt);

			return *this;
		}

		~list()
		{
			clear();

			delete _head;
			_head = nullptr;
		}

		void clear()
		{
			iterator it = begin();
			while (it != end())
			{
				it = erase(it);
			}
		}

		void push_back(const T& x)
		{
			insert(end(), x);
		}

		void push_front(const T& x)
		{
			insert(begin(), x);
		}

		void pop_front()
		{
			erase(begin());
		}

		void pop_back()
		{
			erase(--end());
		}

		iterator insert(iterator pos, const T& x)
		{
			Node* cur = pos._node;
			Node* newnode = new Node(x);

			Node* prev = cur->_prev;

			// prev newnode cur
			prev->_next = newnode;
			newnode->_prev = prev;

			newnode->_next = cur;
			cur->_prev = newnode;

			++_size;

			return iterator(newnode);
		}

		iterator erase(iterator pos)
		{
			Node* cur = pos._node;
			Node* prev = cur->_prev;
			Node* next = cur->_next;

			delete cur;
			prev->_next = next;
			next->_prev = prev;

			--_size;

			return iterator(next);
		}

		size_t size()
		{
			return _size;
		}

	private:
		Node* _head;
		size_t _size;
	};

感谢你看到这,大家共同进步!

相关文章:

  • 《中国工程科学》
  • 探索EasyCVR视频融合平台:在视频编解码与转码领域的灵活性优势
  • 【IOS】申请开发者账号(公司)
  • (已解决)torch.load的时候发生错误ModuleNotFoundError: No module named ‘models‘
  • 【Gitee自动化测试2】Git,Github,Gitlab,Gitee
  • 已存在的Python项目使用依赖管理工具UV
  • 比较 Python Web 框架:Django、FastAPI 和 Flask
  • 微服务注册中⼼1
  • 【计算机组成原理】实验一:运算器输入锁存器数据写实验
  • MCUboot 和 U-Boot区别
  • 什么是ETL?什么是ELT?怎么区分它们使用场景
  • 常见的TTL,RS232,RS485,IIC,SPI,UART之间的联系和区别
  • 【学习笔记】SSL/TLS证书安全机制之证书透明
  • 包/环境管理工具pip和conda介绍
  • LabVIEW提高开发效率技巧----利用第三方库和工具
  • 嵌入式中CW32多功能测试笔实现
  • 使用宝塔部署项目在win上
  • python库 | lxml库
  • STM32与51单片机的区别:是否应该直接学习STM32?
  • 【机器学习】 Flux.jl 求解 XOR 分类问题的神经网络模型
  • 韩国前国务总理韩德洙加入国民力量党
  • 古埃及展进入百天倒计时,闭幕前168小时不闭馆
  • 安徽亳州涡阳县司法局党组书记刘兴连落马
  • 纪念|古文字学泰斗裘锡圭:“还有很多事情要做”
  • 一企业采购国产化肥冒充“挪威化肥”:7人被抓获
  • 印巴局势快速升级,外交部:呼吁印巴以和平稳定的大局为重