迭代器与List

     List是一个容器,在STL库中(标准模板库)。实质上就是一个双向链表,而且这个双向链表是有头的;他有一个空的头结点,插入删除时不用判断表中有无数据,双向循环可以轻易的_head->prev轻松地找到最后一个节点end。

     它使用内置的迭代器来遍历和管理这个容器,迭代器就像指针一样管理着这个空间,重载实现了与指针以一样的++、*、= 、!=等操作符。 下面让我们简单的模拟实现以下吧。


struct ListNode     //双向链表结点
{
	ListNode(const T& data = 0)
	:_next(NULL), _prev(NULL), _data(data)
	{}
	T _data;
	ListNode<T>* _next;
	ListNode<T>* _prev;
};
template<class T>
class List
{
	typedef ListNode<T> Node;
public:
	typedef  _Iterator<T, T&, T*>  Iterator;
	typedef _Iterator<T, const T&, const T*> ConstIterator;
	typedef _ReverseIterator<T, T&, T*> ReverseIterator;
	typedef _ReverseIterator<T, const T&,const T*> ConstReverseIterator;
	List()
		:_head(NewNode())
	{
		_head->_next = _head;
		_head->_prev = _head;
	}
	~List()
	{
		release();
		delete _head;
	}
	Node* NewNode(const T& x)
	{
		return new Node(x);
	}
	Node* NewNode()
	{
		return new Node();
	}

	void PushBack(const T& x)   //尾插
	{
		Node* tail = _head->_prev;
		Node* tmp = NewNode(x);
		tail->_next = tmp;
		tmp->_prev = tail;
		tmp->_next = _head;
		_head->_prev = tmp;
	}


	Iterator Begin()  	//定义返回迭代器类型的Begin()和End()  
	{
		return Iterator(_head->_next);
	}
	Iterator End()
	{
		return Iterator(_head);
	}

	ConstIterator Begin()const	 
	{
		return ConstIterator(_head->_next);
	}
	ConstIterator End()const
	{
		return ConstIterator(_head);
	}
	ReverseIterator rBegin()     //定义返回迭代器类型的rBegin()和rEnd()
	{
		return ReverseIterator(_head->_prev);
	}
	ReverseIterator rEnd()
	{
		return ReverseIterator(_head);
	}
	ConstReverseIterator rBegin()const
	{
		return ConstReverseIterator(_head->_prev);
	}
	ConstReverseIterator rEnd()const
	{
		return ConstReverseIterator(_head);
	}
	void release()
	{
		Node* tmp = _head->_next;
		while (tmp != _head)
		{
			Node* del = tmp;
			tmp = tmp->_next;
			delete del;
		}
	}

	Iterator Erase(Iterator it)
	{
		Node* prev = it._node->_prev;
		Node* next = it._node->_next;
		delete it._node;
		prev->_next = next;
		next->_prev = prev;
		return  prev;
	}
	void PopBack()
	{
		Erase(_head->_prev);
	}
	void remove(int pos)
	{
		Iterator it = Begin();
		while (it != End())
		{
			if (pos == 1)
			it = Erase(it);
			++it;
			--pos;
		}
	}
protected:
	Node* _head;
};
    List实现了尾删和尾插还有随机位置的删除
#include 
    
    
     
     
using namespace std;
template
     
     
      
      
struct ListNode
{
	ListNode(const T& data = 0)
	:_next(NULL), _prev(NULL), _data(data)
	{}
	T _data;
	ListNode
      
      
       
       * _next;
	ListNode
       
       
        
        * _prev;
};

template
        
        
          struct _Iterator { typedef ListNode 
         
           Node; typedef _Iterator 
          
            Self; _Iterator(Node* node) :_node(node) {} Ref operator*() { return _node->_data; } Self& operator++() { _node = _node->_next; return *this; } bool operator!=(const Self& other)const { return other._node != _node; } Node* _node; }; template 
           
             struct _ReverseIterator { typedef ListNode 
            
              Node; typedef _Iterator 
             
               Self; _ReverseIterator(Node* node) :_node(node) {} Ref operator*() { return _node->_data; } Self& operator++() { _node = _node->_prev; return *this; } bool operator!=(const Self& other)const { return other._node != _node; } Node* _node; }; template 
              
                class List { typedef ListNode 
               
                 Node; public: typedef _Iterator 
                
                  Iterator; typedef _Iterator 
                 
                   ConstIterator; typedef _ReverseIterator 
                  
                    ReverseIterator; typedef _ReverseIterator 
                   
                     ConstReverseIterator; List() :_head(NewNode()) { _head->_next = _head; _head->_prev = _head; } ~List() { release(); delete _head; } Node* NewNode(const T& x) { return new Node(x); } Node* NewNode() { return new Node(); } void PushBack(const T& x) //尾插 { Node* tail = _head->_prev; Node* tmp = NewNode(x); tail->_next = tmp; tmp->_prev = tail; tmp->_next = _head; _head->_prev = tmp; } Iterator Begin() //定义返回迭代器类型的Begin()和End() { return Iterator(_head->_next); } Iterator End() { return Iterator(_head); } ConstIterator Begin()const { return ConstIterator(_head->_next); } ConstIterator End()const { return ConstIterator(_head); } ReverseIterator rBegin() //定义返回迭代器类型的rBegin()和rEnd() { return ReverseIterator(_head->_prev); } ReverseIterator rEnd() { return ReverseIterator(_head); } ConstReverseIterator rBegin()const { return ConstReverseIterator(_head->_prev); } ConstReverseIterator rEnd()const { return ConstReverseIterator(_head); } void release() { Node* tmp = _head->_next; while (tmp != _head) { Node* del = tmp; tmp = tmp->_next; delete del; } } Iterator Erase(Iterator it) { Node* prev = it._node->_prev; Node* next = it._node->_next; delete it._node; prev->_next = next; next->_prev = prev; return prev; } void PopBack() { Erase(_head->_prev); } void remove(int pos) { Iterator it = Begin(); while (it != End()) { if (pos == 1) it = Erase(it); ++it; --pos; } } protected: Node* _head; }; 
                    
                   
                  
                 
                
               
              
             
            
           
          
        
       
       
      
      
     
     
    
    





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值