首页 > 编程语言 >STL迭代器适配器reverse_iterator剖析 #C++

STL迭代器适配器reverse_iterator剖析 #C++

时间:2023-08-07 13:00:54浏览次数:32  
标签:reverse iterator 适配器 self current operator 迭代

迭代器适配器(iterator adapters)

迭代器适配器是迭代器应用于迭代器的产物,包括 insert iterator, reverse iterator 和 iostream iterator。迭代器适配器本质是对容器或一般迭代器进行封装,以使其更加符合需求。

reverse_iterator概述

reverse_iterator 可以将一般迭代器的行进方向进行逆转,使operator++ 进行后退操作,使 operator-- 进行前进操作。这种逆转行为运用在从尾部开始进行的算法上有很大方便性。借由 reverse_iterator,可以实现容器的反向迭代器,只需要对容器的正向迭代器进行封装即可。

reverse_iterator完整定义

//接收三个模板参数,第一个模板参数接受正向迭代器;第二、第三个模板参数接收
//引用类型和指针类型,以区别普通对象和const对象
template<typename iterator, typename Ref, typename Ptr>
	class reverse_iterator
  {
    public:
    typedef reverse_iterator<iterator, Ref, Ptr> self;

    public:
    //用正向迭代器进行构造
    reverse_iterator(iterator it)
      :current(it)
      { }
	
    self& operator++()
    {
      --current; //保证行进操作的逆向
      return *this;
    }

    self& operator--()
    {
      ++current;
      return *this;
    }

    self operator++(int)
    {
      self tmp = current;
      --current;
      return tmp;
    }

    self operator--(int)
    {
      self tmp = current;
      ++current;
      return tmp;
    }

    bool operator==(const self& it)
    {
      return current == it.current;
    }

    bool operator!=(const self& it)
    {
      return current != it.current;
    }

    Ref operator*()
    {
      iterator tmp = current;
      return *(--tmp);
    }

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

    private:
    iterator current; //是对正向迭代器的封装
  };

正向迭代器与反向迭代器互为镜像关系,使用begin()对rend()进行构造,使用end()对rbegin()进行构造。一个reverse_iterator的使用情景为:

//借由正向迭代器和迭代器适配器实现链表的反向迭代器
typedef reverse_iterator<iterator, T&, T*> reverse_iterator;
typedef reverse_iterator<const_iterator, const T&, const T*> const_reverse_iterator;

reverse_iterator实现细节

因为正向迭代器与反向迭代器是互为镜像的,所以对反向迭代器进行解引用操作时要注意解引用的位置是在当前 rbegin() 实际位置的前一个位置:

STL迭代器适配器reverse_iterator剖析 #C++_封装

当迭代器被逆转,虽然实体位置不变,但是逻辑位置必须如上图改变,故有了第三部分反向迭代器解引用的代码实现。

标签:reverse,iterator,适配器,self,current,operator,迭代
From: https://blog.51cto.com/158SHI/6992785

相关文章

  • 结构性模式 -- 适配器模式
    Adapter(适配器)--类对象结构模式意图将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能在一起工作的那些类可以在一起工作。别名包装器(wrapper)主要解决什么问题主要解决在软件系统中,常常将一些"现存的对象"放到新的环境中,而新的环......
  • 【刷题笔记】7. Reverse Integer
    题目Givena32-bitsignedinteger,reversedigitsofaninteger.Example1:Input:123Output:321Example2:Input:-123Output:-321Example3:Input:120Output:21**Note:**Assumewearedealingwithanenvironmentwhichcouldonlystoreintegerswi......
  • 适配器模式
    适配器模式**适配器模式:**将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间适配器模式(AdapterPattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。这种模式涉及到一个单一的类,该类负责......
  • 2023 *CTF reverse gorev
    gorev用ida_7.7分析一直分析不出来,得用idafree_8.3分析。(是一道go语言逆向)分析流程就是读入input,然后异或 v22=encoding_base64__ptr_Encoding_EncodeToString看到这个以及后面图片的"="判断出是base64这个就是12345678901234567890123456789012经过异或再base64......
  • 【设计模式】适配器模式Adapter:处理不同 API 接口的兼容性
    (目录)适配器模式适配器模式(AdapterPattern)是作为两个不兼容的接⼝之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独⽴接⼝的功能。在某些时候,客户期望获得某种功能接⼝但现有的接⼝⽆法满⾜客户的需求,例如美国的正常供电电压为110V,⼀个中国⼈带了⼀款中国制造......
  • 适配器模式
    分类类适配器模式对象适配器模式类适配器是由继承关系构成,对象适配器是聚合或组合的关系构成所以类适配器耦合性较高,使用较少角色/结构目标接口:我们中国的手机充电器适配者类:欧洲那边已有的欧洲标准的插座适配器类:可以把我们的手机充电器调整到可以用欧洲插座的适......
  • FIFO FWFT Adapter(First Word Fall Through) 预读FIFO适配器
    预读fifo修改了一下1:增加了暂停预读信号stop。修改2:考虑一种情况,在没有预取的情况下,若fifo剩余的数据长度比预取流水线长度小,且在预取完成的前后一段时间内都没有读请求,empty流水线内会产生一段"气泡"。此时若有新的数据写入fifo,预取流水线不会对这些“气泡”进行填充,如果能......
  • python适配器模式
    classA:  defcost(self):    print('costa')​​classB:  defcost(self):    print('costb')​​classMyAdapter:​  def__init__(self,obj):    self.obj=obj​  defpay(self):    self.obj.cost()​​adt_a=MyAd......
  • android studio 学习数据适配器
    AndroidStudio学习数据适配器在Android开发中,我们经常需要将数据显示在界面上,而数据适配器(Adapter)就是帮助我们将数据和界面进行绑定的重要工具。在本文中,我们将学习如何使用AndroidStudio创建和使用数据适配器。数据适配器的作用数据适配器是连接数据和界面的桥梁,它负责将数......
  • Python【22】 __iter__, __next__, iterable, iterator, 可迭代对象, 迭代
    参考:https://www.jianshu.com/p/1b0686bc166d......