0
点赞
收藏
分享

微信扫一扫

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

迭代器适配器(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++_适配器

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

举报

相关推荐

0 条评论