list的一种实现

template <typename Object>
class List
{
private:
	struct Node
	{
		Objeect data;
		Node *prev;
		Node *next;
		
		Node(const Object &d = Object(), Node *p = NULL, Node *n = NULL)
			: data(d), prev(p), next(n) { }
	};
	
public:
	class const_iterator
	{
	public:
		const_iterator() : current(NULL)
		{}
		
		const Object &operator*() const
		{ return retrieve(); }
		
		const_iterator &operator++()
		{ 
			current = current->next; 
			return *this;
		}
		
		const_iterator &operator++(int)
		{
			const_iterator old = *this;
			++(*this);
			return old;
		}
		
		bool operator==(const const_iterator &rhs) const
		{ return current == current.rhs; }
		bool operator!=(const const_iterator &rhs) const
		{ return !(*this == rhs); }
		
	protected:
		Node *current;
		
		Object &retrieve() const
		{ return current->data; }
		
		const_iterator(Node *p) : current(p)
		{}
		
		friend class List<Object>;
	};
	
	class iterator : public const_iterator
	{
	public:
		iterator()
		{}
		
		Object &opertor*()
		{ return retrieve(); }
		const Object &operator*() const
		{ return const_iterator::operator*(); }
		
		iterator &operator++()
		{
			current = current->next;
			return *this;
		}
		
		iterator &operator++(int)
		{
			iterator old = *this;
			++(*this);
			return old;
		}
		
	protected:
		iterator(Node *p) : const_iterator(p)
		{}
		
		friend class List<Object>;
	};
	
public:
	List()
	{ init(); }
	
	List(const List &rhs)
	{ 
		init();
		*this = rhs;
	}
	
	~List()
	{
		clear();
		delete head;
		delete tail;
	}
	
	const List &operator=(const List &rhs)
	{
		if(this == &rhs)
			return *this;
		
		clear();
		
		for(const_iterator itr = rhs.begin(); itr != rhs.end(); ++itr)
			push_back(*itr);
		
		return *this;
	}
	
	iterator begin()
	{ return iterator(head->next); }
	const_iterator begin() const
	{ return const_iterator(head->next); }
	iterator end()
	{ return iterator(tail); }
	const_iterator end() const
	{ return const_iterator(tail); }
	
	int size() const
	{ return theSize; }
	bool empty() const
	{ return size() == 0; }
	
	void clear()
	{
		while(!empty())
			pop_front();
	}
	
	Object &front()
	{ return *begin(); }
	const Object &front() const
	{ return *begin(); }
	Object &back()
	{ return *--end(); }
	const Object &back() const
	{ return *--end(); }
	void push_front(const Object &x)
	{ insert(begin(), x); }
	void push_back(const Object &x)
	{ insert(end(), x); }
	void pop_front()
	{ erase(begin()); }
	void pop_back()
	{ erase(--end()); }
	
	// Insert x before itr
	iterator insert(iterator itr, const Object &x)
	{
		Node *p = itr.current;
		theSize++;
		return iterator(p->prev = p->prev->next = new Node(x, p->prev, p));
		
		/* p->prev = p->prev->next = new Node(x, p->prev, p);等价于以下3步:
		 * Node *newNode = new Node(x, p->prev, p);
		 * p->prev->next = newNode;
		 * p->prev = newNode;
		 *
		 * 又等价于以下2步:
		 * Node *newNode = new Node(x, p->prev, p);
		 * p->prev = p->prev->next = newNode;
		 */
	}
	
	// Erase item at itr
	iterator erase(iterator itr)
	{
		Node *p = itr.current;
		iterator retVal(p->next);
		p->prev->next = p->next;
		p->next->prev = p->prev;
		delete p;
		theSize--;
		
		return retVal;
	}
	
	iterator erase(iterator start, iterator end)
	{
		for(iterator itr = start; itr != end;)
			itr = erase(itr);
		
		return end;
	}
	
private:
	int theSize;
	Node *head;
	Node *tail;
	
	void init()
	{
		theSize = 0;
		head = new Node;
		tail = new Node;
		head->next = tail;
		tail->prev = head;
	}
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值