STL-模拟实现list

在c++STL库中list的结构设计特比精妙。
其结构为:一个带头结点的双向循环链表
   主要代码实现:
#include <iostream>
#include <assert.h>

using namespace std;


template<typename T>
struct ListNode
{
	ListNode* _next;
	ListNode* _prev;
	T _data;

	ListNode(const T& x)
		:_data(x)
		, _next(NULL)
		, _prev(NULL)
	{}
};

template<typename T, typename Ref, typename Ptr> //迭代器
struct ListIterator
{

	typedef ListNode<T> Node;
	typedef ListIterator<T, Ref, Ptr> Self;

	Node* _node;

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

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

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

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

	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;
	}
};


template<typename T>
class List
{
	typedef ListNode<T> Node;
public:
	typedef ListIterator<T, T&, T*> Iterator;
	typedef ListIterator<T, const T&, const T*> ConstIterator;
public:
	List()
		:_head(BuyNewNode(T()))
	{
		_head->_next = _head;
		_head->_prev = _head;
	}
	~List()
	{
		Node* tmp = _head->_next;

		while (tmp != _head)
		{
			delete tmp->_prev;
			tmp=tmp->_next;
		}
		_head = NULL;
	}

	void PushBack(const T& x)
	{
		//Node* tmp = BuyNewNode(x);

		//_head->_prev->_next = tmp;
		//tmp->_prev = _head->_prev;

		//_head->_prev= tmp;
		//tmp->_next = _head;

		Insert(End(),x);
	}

	void PopBack()
	{
		Erase(--End());
	}

	void PushFront(const T& x)
	{
		Insert(Begin(), x);
	}

	void PopFront()
	{
		Erase(Begin());
	}

	Iterator Insert(Iterator pos, const T& x)
	{
		assert(pos._node);

		Node* cur = pos._node;
		Node* prev = cur->_prev;

		Node* tmp = BuyNewNode(x);

		prev->_next = tmp;
		tmp->_prev = prev;

		tmp->_next = cur;
		cur->_prev = tmp;

		return tmp;
	}

	Iterator Erase(Iterator pos)
	{
		assert(pos._node && pos._node != _head);

		Node* cur = pos._node;
		Node* prev = cur->_prev;
		Node* next = cur->_next;

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

		delete cur;
		cur = NULL;

		return next;
	}

	Iterator Begin()
	{
		//return Iterator(_head->_next);
		return _head->_next;
	}

	Iterator End()
	{
		return Iterator(_head);
	}

	ConstIterator Begin()const
	{
		return ConstIterator(_head->_next);
	}

	ConstIterator End()const
	{
		return ConstIterator(_head);
	}
protected:
	Node* _head;

private:
	Node* BuyNewNode(const T& x)
	{
		//次处应该是空间配置器
		return new Node(x);
	}
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值