广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >浅谈C++反向迭代器的设计
  • 398
分享到

浅谈C++反向迭代器的设计

C++ 反向迭代器 2023-05-18 05:05:59 398人浏览 八月长安
摘要

目录前言一、反向迭代器的结构二、反向迭代器的接口实现1、*运算符重载2、算术运算符 ++ - -的重载3、->操作符重载三、关于反向迭代器的一些讨论前言 STL中不少的容器需要

前言

STL中不少的容器需要有迭代器这样的设计,特别是正向迭代器,几乎每个容器都有自己的特定实现方式,有了正向迭代器之后,我们还要提供反向迭代器以供一些特殊的需求,但是许多容器的正向迭代器实现的方式不一样,如果我们要实现其反向迭代器,每个容器的反向迭代器的实现方式也不一样,有没有一种方法能够统一反向迭代器的实现方式呢?

有的,那就是拿已有的正向迭代器进行封装,这样只要我们实现了正向迭代器,反向迭代器自然而然就形成了,本篇文章我们就来一起探究这种设计方式。

一、反向迭代器的结构

我们设计的反向迭代器是用正向迭代器实现的,这样反向迭代器的实现方式就统一了,那么我们反向迭代器的成员变量就是一个正向迭代器,关于成员函数,我们反向迭代器提供的接口与正向迭代器提供的接口一样。

//第一个模板参数传递 正向迭代器,第二个传递 迭代器的引用 第三个传递 迭代器的地址
 template<class Iterator, class Ref, class Ptr>
 //用struct定义类,因为我们想要公开我们的接口
 struct _reverse_iterator
 {
     //对自己进行typedef方便使用
     typedef _reverse_iterator<Iterator, Ref, Ptr> self;
    //成员变量 是一个正向迭代器
    Iterator _current;
    //构造函数   用一个正向迭代器进行初始化反向迭代器对象
    _reverse_iterator(Iterator it)
        :_current(it)
    {}
    //*运算符重载
    Ref operator*();
    //前置++运算符重载
    self& operator++();
    //后置++运算符重载
    self operator++(int)
    //前置--运算符重载
    self& operator--()
    //后置--运算符
    self operator--(int)
    //->操作符
    Ptr operator->()
    //关系运算符
    bool operator!=(const self& s);
    bool operator==(const self& s);
 }

容器类内的rbegin与rend 函数

//类内使用反向迭代器
class myclass
{
     //此类内要配套有一个正向迭代器iterator,然后传给外面的反向迭代器
     //将反向迭代器进行typedef方便使用
     typedef _reverse_iterator<iterator, T&, T*> reverse_iterator;
      //反向迭代器
     typedef _reverse_iterator<iterator, const T&, const T*> const_reverse_iterator;
     //反向迭代器
     reverse_iterator rbegin()
     {
        return reverse_iterator(end());
     }
     reverse_iterator rend()
     {
         return reverse_iterator(begin());
     }
     //const反向迭代器
     const_reverse_iterator rbegin() const
     {
         return const_reverse_iterator(end());
     }
     const_reverse_iterator rend() const
     {
        return const_reverse_iterator(begin());
     }
};

注意: 反向迭代器这里我们采用了对称结构便于理解对比,但这也导致我们后面在进行*解引用操作符时要解引用前一个位置!

二、反向迭代器的接口实现

1、*运算符重载

我们可以创建一个局部对象,对局部对象进行--找到前一个位置,然后再进行解引用返回就行了。

//*运算符重载
Ref operator*()
{
    //这里是不用写拷贝构造的,默认的拷贝构造会对内置类型进行值拷贝,对自定义类型调用它的拷贝构造
    Iterator tmp = _current;
    --tmp;
    return *tmp;
}

2、算术运算符 ++ - -的重载

由于我们的反向迭代器是由正向迭代器实现的,反向迭代器++就相当于正向迭代器- - ,明白了这个就很好实现算术运算符重载了。

//前置++运算符重载
self& operator++()
{
    --_current;
    return(*this);
}
//后置++运算符重载
self operator++(int)
{
    //保存当前对象
    self tmp(*this);
    --_current;
    //返回--之前的对象
    return tmp;
}
//前置--运算符重载
self& operator--()
{
    ++_current;
    return (*this);
}
//后置--运算符
self operator--(int)
{
    self tmp(*this);
    ++_current;
    return tmp;
}

3、->操作符重载

->运算符重载我们只需要返回容器中存储的自定义类型的对象的地址就行了,我们可以先调用operator*()拿到容器中存储的对象,然后再进行取地址&

Ptr operator->()
{
    return &(operator*());
}

4、关系运算符

要判断两个反向迭代器相不相等,只需要判断反向迭代器里面的成员变量相不相等就行了。

//关系运算符
bool operator!=(const self& s)
{
    return _current != s._current;
}
bool operator==(const self& s)
{
    return _current == s._current;
}

到这里我们的反向迭代器就已经形成了。

三、关于反向迭代器的一些讨论

由于我们的反向迭代器是用模板写的,当我们将vector的迭代器类型传递过去时,我们的反向迭代器就变成了vector的反向迭代器,当我们将list的迭代器传递过去时,就形成了list的反向迭代器。

传递的迭代器必须的二元迭代器,可以++ ,- -。forward_list的迭代器就不行!

例如:实现vector的反向迭代器,我们只需要在类内部传递一下正向迭代器,然后typedef一下就行了。

template<class T>
class vector
{
public:
    //正向迭代器
    typedef  T* iterator;
    //反向迭代器   将正向迭代器进行传递给反向迭代器
    typedef _reverse_iterator<iterator, T&, T*> reverse_iterator;
    typedef _reverse_iterator<iterator, const T&, const T*> const_reverse_iterator;
    //普通迭代器  ------------------------------------------------
    iterator begin();
    iterator end();
    //const迭代器
    typedef const T* const_iterator;
    const_iterator begin() const;
    const_iterator end() const;
    //反向迭代器
    reverse_iterator rbegin()
    {
        return reverse_iterator(end());
    }
    reverse_iterator rend()
    {
        return reverse_iterator(begin());
    }
    //const反向迭代器
    const_reverse_iterator rbegin() const
    {
        return const_reverse_iterator(end());
    }
    const_reverse_iterator rend() const
    {
        return const_reverse_iterator(begin());
    }
    ...... 
    ...... 
    ...... 
};

到此这篇关于浅谈c++反向迭代器的设计的文章就介绍到这了,更多相关C++反向迭代器内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 浅谈C++反向迭代器的设计

本文链接: https://www.lsjlt.com/news/211676.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 浅谈C++反向迭代器的设计
    目录前言一、反向迭代器的结构二、反向迭代器的接口实现1、*运算符重载2、算术运算符 ++ - -的重载3、->操作符重载三、关于反向迭代器的一些讨论前言 STL中不少的容器需要...
    99+
    2023-05-18
    C++ 反向迭代器
  • C++ STL反向迭代器的实现
    反向迭代器其实就行对正向迭代器进行封装,源生迭代器,为了实现运算符的结果不同,正向迭代器也对源生迭代器进行了封装。 反向迭代器的适配器,就是 Iterator是哪个容器的迭代器,re...
    99+
    2022-11-13
  • 浅谈C++ 设计模式的基本原则
    先上银行类案例代码如下: #include<iostream> using namespace std; class BankWorker { public...
    99+
    2022-11-12
  • PHP设计模式之迭代器模式浅析
    目录迭代器模式PHP中的迭代器模式迭代器模式 迭代器模式(Iterator Pattern)是一种常用的设计模式,用于遍历集合中的元素,不暴露集合的内部结构。迭代器模式将集合和遍历分...
    99+
    2023-05-14
    PHP迭代器模式 PHP 设计模式 迭代器模式
  • 浅谈Tomcat多层容器的设计
    目录容器的层次结构请求定位Servlet的过程工作原理Tomcat的容器用来装载Servlet。那Tomcat的Servlet容器是如何设计的呢? 容器的层次结构 Tomcat设计了...
    99+
    2022-11-12
  • C++浅析STL 迭代器 容器的使用
    目录STL定义STL六大组件vectorvector嵌套容器STL定义 STL(Standard Template Library 标准模板库)STL从广义上分为:容器(contai...
    99+
    2022-11-13
  • C#设计模式实现之迭代器模式
    目录前言:一、餐馆合并菜单 二、改进菜单实现 三、迭代器模式 总结前言: 迭代器模式平时用的不多,因为不管C#还是Java都已经帮我封装了,但是你是否知道平时经常在用的东西本质是怎么...
    99+
    2022-11-12
  • PHP设计模式之迭代器模式的使用
    目录Gof类图及解释实例一说到这个模式,就不得不提循环语句。在《大话设计模式》中,作者说道这个模式现在的学习意义更大于实际意义,这是为什么呢?当然就是被foreach这货给整得。任何...
    99+
    2022-11-12
  • Java设计模式中的迭代器模式详解
    目录一 定义二 UML类图三 代码实例四 迭代器模式的优缺点4.1 优点4.2 缺点五 使用场景六 JDK迭代器的运用一 定义 提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露...
    99+
    2023-02-08
    Java迭代器模式 Java设计模式
  • 亚马逊服务器反向代理怎么设置的
    检查您的网站是否支持反向代理。您可以通过在浏览器中查看代理设置,以确保您的网站支持反向代理。 配置反向代理:在您的浏览器中输入“http://”,然后输入您的域名,例如“https://example.com”。这将使代理服务器自动连接到...
    99+
    2023-10-27
    亚马逊 服务器
  • javascript设计模式之迭代器模式的示例分析
    这篇文章主要介绍了javascript设计模式之迭代器模式的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。迭代器模式分为内部迭代器和...
    99+
    2022-10-19
  • C++中单向链表类模板和iterator迭代器类的示例分析
    这篇文章主要介绍了C++中单向链表类模板和iterator迭代器类的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。链表用来构建许多其它数据结构,如堆栈,队列和他们的派...
    99+
    2023-06-29
  • 如何深入理解Java设计模式的迭代器模式
    如何深入理解Java设计模式的迭代器模式,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、什么是迭代器模式迭代器模式是针对集合对象而生的,对于集合对象而言,肯定...
    99+
    2023-06-25
  • Python使用设计模式中的责任链模式与迭代器模式的示例
    责任链模式 责任链模式:将能处理请求的对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理请求为止,避免请求的发送者和接收者之间的耦合关系。 #encoding=utf-8 # #by pan...
    99+
    2022-06-04
    模式 示例 迭代
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作