标签:c++
#pragma once
template<class T>
struct __ListNode
{
	__ListNode<T>* _next;
	__ListNode<T>* _prev;
	T _data;
	__ListNode(const T& x = T())
		:_next(NULL)
		,_prev(NULL)
		,_data(x)
	{}
};
template<class T, class Ref, class Ptr>
struct __ListIterator
{
	typedef __ListIterator<T, Ref, Ptr> Self;
	typedef T ValueType;
	typedef Ref Reference;
	typedef Ptr Pointer;
	//////////////////////////////////////////////////////////////////////////
	__ListNode<T>* _node;
	//////////////////////////////////////////////////////////////////////////
	
	__ListIterator()
	{}
	__ListIterator(__ListNode<T>* x)
		:_node(x)
	{}
	bool operator==(const Self& s)
	{
		return _node == s._node;
	}
	bool operator!=(const Self& s)
	{
		return _node != s._node;
	}
	Reference 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<class T>
class List
{
public:
	typedef __ListNode<T> ListNode;
	typedef __ListIterator<T, T&, T*> Iterator;
	List()
	{
		_head = new ListNode;
		_head->_next = _head;
		_head->_prev = _head;
	}
	void Insert(Iterator pos, const T& x)
	{
		ListNode* cur = pos._node;
		ListNode* prev = cur->_prev;
		ListNode* tmp = new ListNode(x);
		prev->_next = tmp;
		tmp->_next = cur;
		tmp->_prev = prev;
		cur->_prev = tmp;
	}
	void PushBack(const T& x)
	{
		Insert(End(), x);
	}
	void PushFront(const T& x)
	{
		Insert(Begin(), x);
	}
	void PopBack()
	{
		Erase(--End());
	}
	Iterator Erase(Iterator pos)
	{
		assert(!pos.End());
		ListNode* prev = pos._node->_prev;
		ListNode* next = pos._node->_next;
		prev->_next = next;
		next->_prev = prev;
		delete pos._node;
		return Iterator(next);
	}
	Iterator Begin()
	{
		return Iterator(_head->_next);
	}
	Iterator End()
	{
		return Iterator(_head);
	}
protected:
	ListNode* _head;
};
void Test()
{
	List<int> list;
	list.PushBack(1);
	list.PushBack(2);
	list.PushBack(3);
	list.PushBack(4);
	List<int>::Iterator it = list.Begin();
	while (it != list.End())
	{
		*it = 10;
		cout<<*it<<" ";
		++it;
	}
	cout<<endl;
}本文出自 “zgw285763054” 博客,请务必保留此出处http://zgw285763054.blog.51cto.com/11591804/1827262
标签:c++
原文地址:http://zgw285763054.blog.51cto.com/11591804/1827262