【玩转c++】反向迭代器的适配器模型

文章介绍了STL中反向迭代器的实现原理,通过适配器将正向迭代器转换为反向迭代器,以提高代码复用性。反向迭代器允许对容器进行反向遍历,其核心在于通过操作符重载实现++和--的反转效果。这种设计使得所有拥有正向迭代器的容器都能方便地支持反向遍历。
摘要由CSDN通过智能技术生成

本期主题:STL中反向迭代器的实现

博客主页: 小峰同学

分享小编的在学习到的知识和遇到的问题

小编的能力有限,出现错误希望大家不吝赐

1.反向迭代器

反向迭代器,我们想想,一开始我们正向迭代器,就是用类模板或者直接用原生指针,实现的.
前面我们写过的迭代器拷贝一份,然后++ 变成 -- , -- 变成++ 即可.
我们就会发现,这样实现的时候,每个容器都要去写这样一个东西.代码很冗余.
所以我们就实现一个通用的反向迭代器,就是如果存在正向迭代器,直接适配出我们的反向迭代器.
还有什么别的方法吗?
我们可以直接使用适配器,把正向迭代器,适配为一个反向迭代器.即可.

2.源码

大思路有了,直接上手.
实现过程有解析.
//反向迭代器的适配器 。


namespace zxf
{
    //调用的时候,一般都是在别的类内部使用,供别的类调用
    //typedef reverse_iterator<iterator> reverse_iterator;
    //typedef reverse_iterator<const_iterator> const_reverse_iterator;
    //这里就是使用 iterator 适配 reverse_ierator
    //使用const_iterator 适配 const_reverse_iterator

     template<class iterator, class ref, class ptr>
    class reverse_iterator
    {
    public:
        typedef reverse_iterator<iterator, ref, ptr> self;
        //迭代器在定义的时候 必须初始化。
        reverse_iterator(const iterator it)
            :_it(it)//注意只能写在初始化列表中,不能写在函数体内部
            //_it是一个正向迭代器,迭代器在创建的时候必须初始化。
        {}
        self operator++(){
            --_it;
            return *this;
        }
        self operator--(){
            ++_it;
            return *this;
        }
        
        //iterator也是一个类模板,它是对 pnode(node*)(list就是节点的指针,vector就是元素的指针) 的封装
        //iterator知道数据类型,但是reverse_iterator不知道数据类型。

        ref operator*(){//这就是为啥要给出第二个模板参数的原因之一:
            //我们无法知道iterator类模板成员变量指向的元素的类型,所以要把那个元素的类型传过来。
            //另一个原因就是区分开我们的const反向迭代器和正常反向迭代器。
            iterator tmp = _it;
            return *(--tmp);
            //这里'--'的原因就是我们在设置反向迭代器的rbegin() 和 rend()是怎么实现的
            //这就是一个边界的问题,和 rbegin() ,rend()  结合看的。
            //假如你改变 自己实现的 rbegin() ,rend() 也可以不 '--'。
        }
        bool operator!=(const self& it)//这里引用可加可不加
        {
            return _it != (it._it);
        }

    private:
        iterator _it;//底层的正向迭代器。
    };
}

3,反向迭代器的意义是什么呢?

重点就是复用,这里的反向迭代器不是针对某一个容器写的,是针所有的容器写的,
只要一个容器有正向迭代器,就一定可以适配出反向迭代器.
代码的复用性很好,是STL中很精华的部分.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小峰同学&&&

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值