list 迭代器的简单实现

List是一个容器,在STL库中(标准模板库)。实质上就是一个双向链表,而且这个双向链表是有头的;他有一个空的头结点,插入删除时不用判断表中有无数据,双向循环可以轻易的_head->prev轻松地找到最后一个节点end。
它使用内置的迭代器来遍历和管理这个容器,迭代器就像指针一样管理着这个空间,重载实现了与指针一样的++、*、= 、!=等操作符。迭代器实质上就是遍历访问容器里面的元素。不同的容器,它的遍历方式不同,迭代器也就各不相同。

#include <iostream>
using namespace std;
template<class T>
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 Ref, class Ptr>
struct _Iterator//----------迭代器的重载
{
    typedef ListNode<T> Node;
    typedef _Iterator<T, Ref, Ptr> 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<class T, class Ref, class Ptr>
struct _ReverseIterator   //-----------反向迭代器重载
{

    typedef ListNode<T> Node;
    typedef _Iterator<T, Ref, Ptr> 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 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()// 用于head传值
    {
        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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值