反向迭代器

简介: 在官方库中,反向迭代器是使用适配器封装的,即用普通的迭代器去作为适配器,然后封装出一个反向迭代器出来。

在官方库中,反向迭代器是使用适配器封装的,即用普通的迭代器去作为适配器,然后封装出一个反向迭代器出来。

 

关于迭代器的解析,在介绍实习list以及迭代器这篇文章中有较详细讲解。此处重点是反向迭代器的原理和实现。list---迭代器的原理和实现

开始实现反向迭代器

首先是类模板,Iterator代表的是适配器,Ref和Ptr代表的是引用和取地址。

template<classIterator,classRef,classPtr>classReverse_Iterator{
public:
typedefReverse_Iterator<Iterator,Ref,Ptr>Slef;
private:
Iterator_it;//_it的类型是Iterator,是传进来的适配器的类型};

image.gif

反向迭代器的++和--,即往后走和往前走:

正向迭代器的++/--,即是反向迭代器的--/++:

因为是通过正向迭代器作为适配器的,当it进行++或--的时候,就会去调用正向迭代器中的operator++()和operator--();

Slef&operator++()
    {
--it;//会调用正向迭代器的operator--();return*this;
    }
Slef&operator--()
    {
++it;//会调用正向迭代器的operator++();return*this;
    }

image.gif

反向迭代器的解引用

根据官方库中的源代码,我们可以分析得到,反向迭代器中的rbegin和rend,与正向迭代器的end()和begin()是对称的。

()NR2]`R$]_O4SWQZ6JQRQR.png

如下图:

_5)8QJX(A_MOH1G`N0O~CDQ.png

因此,当解引用的时候,需要减一步,才能解引用。比如上图:rbegin()在头节点上,减一步,就到了节点的值为4的节点上,然后一值遍历的话,最终会在遍历完1的节点后结束。

Refoperator*()
    {
Iteratortmp=_it;
return*(--tmp);
    }

image.gif

对于operator->(),返回的是数据的地址,我们可以使用operator*()拿到数据,然后取地址即可。

Ptroperator->()
    {
return*(operator*());
    }

image.gif

反向迭代器的构造函数

只需在初始化列表上,将迭代器指向的节点或顺序表中的某个位置赋值给反向迭代器的对象即可。

Reverse_Iterator(Iteratorit)
        :_it(it)
    {}

image.gif

因为是需要指向同一块地址,所以不需要深拷贝,不需要析构函数!

最后稍微完善一下即可:

template<classIterator,classRef,classPtr>classReverse_Iterator{
public:
typedefReverse_Iterator<Iterator,Ref,Ptr>Slef;
Reverse_Iterator(Iteratorit)
        :_it(it)
    {}
Refoperator*()
    {
Iteratortmp=_it;
return*(--tmp);
    }
Ptroperator->()
    {
return*(operator*());
    }
Slef&operator++()
    {
--it;
return*this;
    }
Slef&operator--()
    {
++it;
return*this;
    }
booloperator!=(constSlef&s)
    {
return_it!=s._it;
    }
private:
Iterator_it;
};

image.gif

P{QZXUW3Q(ETZ(CGHZO[MTR.png

reverse_iteratorrbegin()
        {
returnreverse_iterator(end());
        }
reverse_iteratorrend()
        {
returnreverse_iterator(begin());
        }
const_reverse_iteratorrbegin() const        {
returnconst_reverse_iterator(end());
        }
const_reverse_iteratorrend() const        {
returnconst_reverse_iterator(begin());
        }

image.gif

//反向迭代器的rbegin()reverse_iteratorrbegin()
        {
//通过end()返回链表的哨兵位头节点,然后通过构造函数将反向迭代器的对象初始化,并且是浅拷贝,指向同一块空间returnreverse_iterator(end());
        }
//反向迭代器的rend()reverse_iteratorrend()
        {
//通过begin()返回链表的尾节点,然后通过构造函数将反向迭代器的对象初始化,并且是浅拷贝,指向同一块空间returnreverse_iterator(begin());
        }
//const版本反向迭代器的rbegin()const_reverse_iteratorrbegin() const        {
returnconst_reverse_iterator(end());
        }
//const版本反向迭代器的rend()const_reverse_iteratorrend() const        {
returnconst_reverse_iterator(begin());
        }

image.gif

这样实现的反向迭代器,就可以用到list,vector等等的容器,因为只需提供适合的迭代器作为适配器即可。

相关文章
|
Shell Android开发
Android系统 adb shell push/pull 禁止特定文件
Android系统 adb shell push/pull 禁止特定文件
1130 1
|
Java 应用服务中间件
JavaWeb 文件上传和下载
JavaWeb——文件上传与下载 内容分享。
379 0
|
JavaScript Java 测试技术
基于小程序的社区互助养老+springboot+vue.js附带文章和源代码设计说明文档ppt
基于小程序的社区互助养老+springboot+vue.js附带文章和源代码设计说明文档ppt
125 0
|
网络安全 Docker 容器
【docker专题_01】docker搭建elasticsearch集群 -
【docker专题_01】docker搭建elasticsearch集群 -
162 1
|
存储 移动开发 JavaScript
JavaScript函数和BOM
JavaScript函数和BOM
88 0
小白的第二个项目--扫雷游戏
小白的第二个项目--扫雷游戏
205 0
|
算法框架/工具 PyTorch 异构计算
点赞收藏:PyTorch常用代码段整理合集
本文代码基于 PyTorch 1.0 版本
1862 0
|
SQL JSON HIVE
根据JSON创建对应的HIVE表
  本文提供一种用SCALA把JSON串转换为HIVE表的方法,由于比较简单,只贴代码,不做解释。有问题可以留言探讨 package com.gabry.hiveimport org.json4s.
1480 0
|
3天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1101 0
|
2天前
|
机器学习/深度学习 人工智能 前端开发
通义DeepResearch全面开源!同步分享可落地的高阶Agent构建方法论
通义研究团队开源发布通义 DeepResearch —— 首个在性能上可与 OpenAI DeepResearch 相媲美、并在多项权威基准测试中取得领先表现的全开源 Web Agent。
461 9