反向迭代器

反向迭代器是一种倒序遍历数据结构的工具,它通过内部使用正向迭代器来实现。文章详细解释了反向迭代器的概念,展示了如何通过重载运算符来实现反向迭代,并指出在标准库中的rbegin和rend并非如预期那样直接指向最后一个元素。反向迭代器可以方便地应用于各种容器,如list和vector,是C++中迭代器设计的一个重要方面。
摘要由CSDN通过智能技术生成

反向迭代器的概念非常的简单,就是和正向迭代器相反,它是倒过来遍历数据的。

它的底层是用正向迭代器进行适配的:

template <class Iterator>

class RverseIterator
{
    typedef RverseIterator<iterator> Sef;
public:

    RverseIterator(Iterator it)
        :_it(it);
    {

    }
    Self& operator ++()
    {
        --_it;
        return *this;
    }

    Self& operator --()
    {
        ++_it;
        return *this;
    }

    bool operator !=(const Self& it) const
    {
        return _it != it;
    }

private:
    Iterator _it;
};

到这里代码实现问题不大,但是我们运算符重载*时发现和库中的大有区别:

这是什么原因呢?

因为库中的rbegin和rend不是我们想象的那种实现的:(以下是我们认为的)

所以真正的代码实现是这样的:

但是我们不知道迭代器中存储值的类型,我们依旧可以复用实现好的迭代器的模板参数:

以下是反向迭代器的完整代码:

#pragma once


template <class Iterator, class Ref, class Ptr>

class RverseIterator
{
    typedef RverseIterator<Iterator, Ref, Ptr> Sef;
public:

    RverseIterator(Iterator it)
        :_it(it)
    {

    }

    Ptr operator ->()   //箭头就是返回数据的地址
    {
        return &(*_it);
    }
    Ref operator* ()
    {
        Iterator tmp = _it;
        return  *(--tmp);
    }

    Sef& operator ++()
    {
        --_it;
        return *this;
    }

    Sef& operator --()
    {
        ++_it;
        return *this;
    }

    bool operator !=(const Sef& s) const
    {
        return _it != s._it;
    }

private:
    Iterator _it;
};

接下来我们可以将反向迭代器复用到我们之前实现的list里面去:

template<class T>
    class list
    {
        typedef Listnode<T> Node;
    public:
        typedef _list_iterator<T,T&,T*> iterator; 
        typedef _list_iterator<T,const T&,const T*> const_iterator;
        typedef RverseIterator<iterator, T&, T*> reverse_iterator;

        typedef RverseIterator<const_iterator, const T&, const T*> const_reverse_iterator;


        const_iterator begin() const
        {
            return  const_iterator(_head->_next);
        }
        const_iterator end()const
        {
            return  const_iterator(_head);
        }

        const_reverse_iterator rbegin() const
        {
            return  const_reverse_iterator(end());
        }
        const_reverse_iterator rend()const
        {
            return  const_reverse_iterator(begin());
        }

        iterator begin()
        {
            return iterator(_head->_next);
        }
        iterator end()
        {
            return iterator(_head);
        }


        reverse_iterator rbegin()
        {
            return reverse_iterator(end());
        }
        reverse_iterator rend()
        {
            return reverse_iterator(begin());
        }
}

由此可以得出这样的结论:

反向迭代器是用正向迭代器适配出来的,我们只要写出了反向迭代器就可以复用到任何容器中,如list、vector。反向迭代器的学习了解就行,我们学习它的原因就是了解c++大佬们在设计反向迭代器的时候用到的设计理念。说白了反向迭代器是更深层次的封装。

到这里我对反向迭代器的理解就这么多了,如果讲述的不对的地方,希望大佬们指正出来!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值