反向迭代器

目录

介绍

适配器 

模拟实现

结构

​编辑

代码

加入到list中


介绍

在C++中,反向迭代器(reverse iterator)是一种特殊的迭代器,它能够在容器中从逆序访问容器

C++标准库提供了std::reverse_iterator,用于创建反向迭代器

适配器 

std::reverse_iterator是一个适配器,实际上它是在正向迭代器的基础上进行包装创建出来的

模拟实现

结构

从源代码可以看出来,反向迭代器的类是传入了正向迭代器构建的

反向迭代器_第1张图片

两种迭代器的起始位置是镜像的,这种的好处就是可以很好的适配所有容器

  • 如果反向迭代器的起始位置与正向迭代器的起始位置相同,那么遍历的方向就会发生冲突,而在实际操作中,可能需要修改容器来实现逆序遍历
  • 而且如果这样,要遍历的话可别扭了

反向迭代器_第2张图片 

如果直接按照元素来确定迭代器的位置

  • 比如上图,按照一般想法,4的位置是rbegin,end的位置是rend,似乎也可以
  • 但可能在其他容器里不行吧(目前知道的vector和list似乎可以这样,其他的就不知道了)

代码

template 
struct myreverse_iterator
{
    typedef myreverse_iterator self; //有些接口需要返回迭代器类型
    myreverse_iterator(iterator tmp)
//一般是调用容器里的rbegin/rend,而这两个是调用的begin和end,他俩返回的是正向迭代器类型
//所以参数是iterator
    {
        _it = tmp;
    } 
    Ref operator*() //ref用于确定自身引用类型是否为const
    {
        iterator tmp = _it;
        return *(--tmp); //因为rbegin的位置是end,end位置没有元素,它的前一个才是有效元素
    }
    Ptr operator->() //ptr用于确定自身指针类型是否为const
    {
        return &(operator*());
    }
    self &operator++()
    {
        --_it; 
        return (*this);
    }
    self operator++(int) 
    {
        self tmp = *this;
        --_it;
        return (tmp);
    }
    self &operator--()
    {
        ++_it;
        return (*this);
    }
    self operator--(int)
    {
        self tmp = *this;
        ++_it;
        return (tmp);
    }
    bool operator!=(const self& it) const
    {
        return _it != it._it;
    }
    bool operator==(const self& it) const
    {
        return _it == it._it;
    }


    iterator _it; //反向迭代器的操作 实际上还是正向迭代器去走
};

加入到list中

// list类
    template 
    class mylist
    {
        typedef ListNode Node;
        typedef Node *PNode;

    public: // 两种迭代器
        typedef ListIterator iterator;
        typedef ListIterator const_iterator;

#include "reverse_iteritor.hpp" //反向迭代器
        typedef myreverse_iterator reverse_iterator;
        typedef myreverse_iterator const_reverse_iterator;

        // List Iterator
        iterator begin()
        {
            return iterator(_pHead->_pnext);
        }
        iterator end()
        {
            return iterator(_pHead);
        }
        const_iterator begin() const
        {
            return const_iterator(_pHead->_pnext);
        }
        const_iterator end() const
        {
            return const_iterator(_pHead);
        }

        // List reverse_Iterator
        reverse_iterator rbegin()
        {
            return reverse_iterator(end());
        }
        reverse_iterator rend()
        {
            return reverse_iterator(begin());
        }
        const_reverse_iterator rbegin() const
        {
            return const_reverse_iterator(end());
        }
        const_reverse_iterator rend() const
        {
            return const_reverse_iterator(begin());
        }

加入其他类的方法都是一样的

你可能感兴趣的:(c++,c++)