c++STL list 简单模拟实现

2024-04-11 1043阅读

分享一份c++stl库list简单模拟实现。

c++STL list 简单模拟实现
(图片来源网络,侵删)

如果能帮到你的话请点个免费的赞吧!!!!!

​
#pragma once
#include
namespace my_list {
	template
	class ListNode {
		typedef ListNode Node;
	public:
		//list中需要访问node中的元素,所以用公有
		Node* _prev;
		Node* _next;
		T _val;
		//初始化
		ListNode(const T& val = T())
			:_val( val),
			_prev(nullptr),
			_next(nullptr)
		{}
	};
	//ref是t的引用,Ptr是t的指针
	template
	class ListIterator {
		typedef ListNode Node;
		typedef ListIterator iterator;
	public:
		Node* _Node;
		ListIterator(Node* node)
			:_Node(node)
		{}
		Ref operator*() 
		{
			return _Node->_val;
		}
		Ptr operator->()
		{
			return &_Node->_val;
		}
		//++it
		iterator& operator++() {
			_Node = _Node->_next;
			return *this;
		}
		//it++
		iterator operator++(int) {
			iterator tmp(*this);
			_Node = _Node->_next;
			return tmp;
		}//--it
		iterator& operator--() {
			_Node = _Node->_prev;
			return *this;
		}
		//it++
		iterator operator--(int) {
			iterator tmp(*this);
			_Node = _Node->_prev;
			return tmp;
		}
		bool operator!=(const iterator& it) {
			return it._Node != _Node;
		}
		bool operator==(const iterator& it) {
			return it._Node == _Node;
		}
	};
	template
	class List {
		typedef ListNode Node;
		Node* _head;
		size_t _size;
	public:
		typedef List list;
		typedef ListIterator iterator;
		typedef ListIterator const_iterator;
		void Init()
		{
			_head = new Node;
			_head->_next = _head;
			_head->_prev = _head;
			_size = 0;
		}
		List()
		{
			Init();
		}
		List(const List& it) {
			Init();
			for (auto e : it)
			{
				push_back(e);
			}
		}
		list& operator=(list A) {
			swap(A);
			return *this;
		}
		iterator begin() {
			return _head->_next;
		}
		iterator end() {
			return _head;
		}
		const_iterator begin()	const {
			return _head->_next;
		}
		const_iterator end()	const {
			return _head;
		}
		void insert(iterator it, T val) {
			Node* tmp = new Node(val);
			Node* prev = it._Node->_prev;
			Node* next = it._Node;
			prev->_next = tmp, tmp->_prev = prev;
			next->_prev = tmp, tmp->_next = next;
			_size++;
		}
		void push_back(T val)
		{
			insert(end(), val);
		}
		void push_front(T val)
		{
			insert(begin(), val);
		}
		iterator earse(iterator it)
		{
			Node* node = it._Node;
			Node* prev = node->_prev;
			Node* next = node->_next;
		
			delete node;
			prev->_next = next;
			next->_prev = prev;
			_size--;
			return next;
		}
		void pop_back() {
			earse(begin());
		}
		void pop_front() {
			earse(--end());
		}
		void swap(list A)
		{
			std::swap(_head, A._head);
			std::swap(_size, A._size);
		}
		size_t size() {
			return _size;
		}
		void clear() {
			iterator it = begin();
			while (it != end())
			{
				it = earse(it);
			}
		}
		~List() {
			clear();
			delete _head;
			_head = nullptr;
		}
	};
​
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]