STL - list

STL - list

  • [STL - list](#STL - list)
      • [结点 ListNode](#结点 ListNode)
      • [迭代器 ListIterator](#迭代器 ListIterator)
      • [反向迭代器 Reverse_iterator](#反向迭代器 Reverse_iterator)
      • [管理操作 list](#管理操作 list)

STL - list

结点 ListNode

作为储存数据的单元位。

cpp 复制代码
template<class T>
struct ListNode
{
	T _val;
	ListNode* _next;
	ListNode* _prev;
	ListNode()
		:_val(0)
		,_next(nullptr)
		,_prev(nullptr)
	{}
};

迭代器 ListIterator

作为访问节点的工具。

cpp 复制代码
template<class T,class Ptr, class Ref>
class ListIterator
{
private:
	typedef ListNode<T>* PNode;
	typedef ListIterator<T,Ptr,ref> Self;
public:	
	PNode it;
	ListIterator(PNode x = nullptr)
		:it(x)
	{}
	Ptr operator-> ()
	{
		return &(it->_val);
	}
	Ref operator* ()
	{
		return it->val;
	}
	Self& operator++ ()
	{
		it=it->_next;
		return *this;
	}
	Self operator++ (int)
	{
		Self ret = it;
		it = it-> _next;
		return ret;
	}
	Self& operator-- ()
	{
		it=it->_prev;
		return *this;
	}
	Self operator-- (int)
	{
		Self ret = it;
		it = it-> _prev;
		return ret;
	}
	bool operator!=(const Slef& l)
	{
		return it != l.it;
	}
	bool operator==(const Slef& l)
	{
		return it == l.it;
	}
	Self& operator=(const Slef& l)
	{
		it = l.it;
		return *this;
	}
};

反向迭代器 Reverse_iterator

以Iterator为模板,编写统一的反向迭代器模板

cpp 复制代码
template<class Iterator, class Ptr, class Ref>
struct Reverse_iterator
{
    Iterator _it;

    typedef Reverse_iterator<Iterator, Ptr, Ref> Self;

    Reverse_iterator(Iterator x)
    {
        _it = x;
    }
    Reverse_iterator() {}

    bool operator!=(const Self& tmp)
    {
        return _it != tmp._it;
    }

	Ptr operator*()
    {
        Iterator ret = _it;
        --ret;
        return *ret;
    }

	Ref operator->()
	{
		return &(operator*());
	}

	Self& operator++()
    {
		--_it;
		return *this;
    }


	Self& operator--()
    {
		++_it;
		return *this;
    }
};

管理操作 list

为用户提供函数接口。

cpp 复制代码
template<class T>
class list
{
private:
	typedef ListNode<T> _Node;
	typedef ListNode<T>* _PNode;
	_PNode _head;
	size_t _size;
	
	void empty_init()
	{
		_head = new _Node;
		_head -> _next = _head -> _prev = nullptr;
		_size = 0;
	}
public:
	typedef ListIterator<T,T*,T&> iterator;
	typedef ListIterator<const T, const T*, const T&> const_iterstor;
	typedef Reverse_iterator<iterator, T*, T&> reverse_iterator;
	typedef Reverse_iterator<const_iterator, const T*, const T&> const_reverse_iterator;

	reverse_iterator rbegin()
	{
		return reverse_iterator(end());
	}

	const_reverse_iterator crbegin() const
	{
		return const_reverse_iterator(end());
	}

	reverse_iterator rend()
	{
		return reverse_iterator(begin());
	}

	const_reverse_iterator crend() const
	{
		return const_reverse_iterator(begin());
	}

	void insert(iterator pos, const T& val)
	{
		size++;
		PNode cur = new Node;
		PNode next = pos.it;
		PNode prev = next->_prev;


		cur->_next = next;
		cur->_prev = prev;
		next->_prev = cur;
		prev->_next = cur;
		cur->_val = val;
	}


	iterator begin()
	{
		return _head->_next;
	}


	iterator end()
	{
		return _head;
	}


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


	const_iterator end() const
	{
		return _head;
	}


	list()
	{
		empty_init();
	}
	list(int n, const T& value = T())
	{
		empty_init();
		while (n--)
		{
			push_back(value);
		}
	}
	template <class Iterator>
	list(Iterator first, Iterator last)
	{
		empty_init();
		while (first != last)
		{
			push_back(*first);
			++first;
		}
	}
	list(const list<T>& l)
	{
		empty_init();
		for (auto& e : l)
			push_back(e);
	}


	list<T>& operator=(const list<T> l)
	{
		swap(l);
		return *this;
	}
	void clear()
	{
		iterator it = begin();
		while (it != end())
		{
			it = erase(it);
		}
	}
	~list()
	{
		clear();
		delete _head;
	}


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


	void push_front(const T& val)
	{
		insert(begin(), val);
	}
	void push_back(const T& val)
	{
		insert(end(), val);
	}


	iterator erase(iterator pos)
	{
		size--;
		PNode next = (pos.it)->_next;
		PNode prev = (pos.it)->_prev;

		next->_prev = prev;
		prev->_next = next;
		delete pos.it;
		return next;
	}


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


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

以上就是本期的全部内容了,喜欢就多多关注吧!!!

相关推荐
2401_894915532 分钟前
GEO 搜索优化完整源码从零部署:环境配置、集群搭建全流程
开发语言·python·tcp/ip·算法·unity
2501_936415698 分钟前
可变参数&综合练习&斗地主游戏
java·windows·游戏
颜x小2 小时前
[C#] C++与c#语法对比
开发语言·c++·c#
weixin_423652133 小时前
C#使用JObject
开发语言·c#
国科安芯3 小时前
FreeRTOS RISC-V 浮点上下文切换移植:在 IAR 工程中完整保存 FPU 寄存器
java·开发语言·单片机·嵌入式硬件·算法·系统架构·risc-v
汉克老师4 小时前
GESP2026年3月认证C++八级( 第三部分编程题(2、子图最短路)精讲
c++·最短路·floyd·gesp8级
霸道流氓气质4 小时前
Java中集成Smile 技术教程:从入门到工程实践
java·开发语言
BerrySen1785 小时前
迈向 Next-Gen Java:企业级高并发架构演进与大模型 Agent 落地深度实战
java·开发语言·架构
abcd_zjq5 小时前
海康线扫相机使用
c++·海康
十五年专注C++开发5 小时前
C++设计一个函数来求容器元素绝对值之和的平均值
c++·模板·accumulate