C++反向迭代器

简介: C++反向迭代器

反向迭代器在实现上其实是复用了正向迭代器的代码,即利用正向迭代器进行适配,能适配的原因:有很多功能都是重合的,如 *,->,++,--等,正反迭代器唯一的区别就是方向相反。

如图

那么如何用正向迭代器进行适配呢?

定义模板

这个正向迭代器可以传任何容器,如 vector、list等

反向迭代器的各种接口可以直接或间接复用正向迭代器 _it 的,Iterator 是传过来的容器模板类型,_it 是实例化的正向迭代器对象

以list举例:在list 中typedef 重命名为 reverse_iterator,同一命名。

正向迭代器和反向迭代器的恰好对称再加上解引用时的 “先 - - ,再解引用”,恰好完美符合正向和反向迭代遍历!

迭代器内部代码:

template<class Iterator, class Ref, class Ptr>
  class Reverse_Iterator
  {
  public:
    typedef Reverse_Iterator<Iterator, Ref, Ptr> self;
    Reverse_Iterator(Iterator it)
      :_it(it)
    {}
    self& operator++()
    {
      --_it;
      return *this;
    }
    self& operator--()
    {
      ++_it;
      return *this;
    }
    Ref operator*()
    {
      Iterator tmp = _it;
      return *(--tmp);
    }
    Ptr operator->()
    {
      return &(operator*());
    }
    bool operator!=(const self& it)
    {
      return _it != it._it;
    }
  private:
    Iterator _it;
  };

list中需要额外添加的代码来调用迭代器:

typedef Reverse_Iterator<iterator, T&, T*> reverse_iterator;
reverse_iterator rbegin()
{
  return reverse_iterator(end());
}
reverse_iterator rend()
{
  return reverse_iterator(begin());
}

const_reverse_iterator的迭代器也是复用普通迭代器,只需要在list中添加如下代码来调用:

typedef ReverseIterator<const_iterator, const T&, const T*> const_reverse_iterator;
const_reverse_iterator rbegin() const
{
    return const_reverse_iterator(end());
}
const_reverse_iterator rend() const
{
  return const_reverse_iterator(begin());
}
相关文章
|
3月前
|
C++ 容器
【C/C++笔记】迭代器
【C/C++笔记】迭代器
23 1
|
3月前
|
存储 安全 程序员
【C/C++笔记】迭代器范围
【C/C++笔记】迭代器范围
64 0
|
5月前
|
算法 数据处理 C++
C++一分钟之-迭代器与算法
【6月更文挑战第21天】C++ STL的迭代器统一了容器元素访问,分为多种类型,如输入、输出、前向、双向和随机访问。迭代器使用时需留意失效和类型匹配。STL算法如查找、排序、复制要求特定类型的迭代器,注意容器兼容性和返回值处理。适配器和算法组合增强灵活性,但过度使用可能降低代码可读性。掌握迭代器和算法能提升编程效率和代码质量。
51 3
|
5月前
|
编译器 C语言 C++
C++ STL中list迭代器的实现
C++ STL中list迭代器的实现
C++ STL中list迭代器的实现
|
5月前
|
存储 编译器 Linux
C++初阶学习第十弹——探索STL奥秘(五)——深入讲解vector的迭代器失效问题
C++初阶学习第十弹——探索STL奥秘(五)——深入讲解vector的迭代器失效问题
52 7
|
4月前
|
C++ 容器
【C++】string类的使用①(迭代器接口begin,end,rbegin和rend)
迭代器接口是获取容器元素指针的成员函数。`begin()`返回首元素的正向迭代器,`end()`返回末元素之后的位置。`rbegin()`和`rend()`提供反向迭代器,分别指向尾元素和首元素之前。C++11增加了const版本以供只读访问。示例代码展示了如何使用这些迭代器遍历字符串。
|
5月前
|
编译器 C++
C++ 反向迭代器的设计与实现
C++ 反向迭代器的设计与实现
|
5月前
|
算法 编译器 Linux
【C++/STL】:vector容器的底层剖析&&迭代器失效&&隐藏的浅拷贝
【C++/STL】:vector容器的底层剖析&&迭代器失效&&隐藏的浅拷贝
44 0
|
5月前
|
存储 缓存 编译器
【C++进阶】深入STL之list:模拟实现深入理解List与迭代器
【C++进阶】深入STL之list:模拟实现深入理解List与迭代器
36 0
|
5月前
|
编译器 C++ 容器
【C++进阶】深入STL之vector:深入研究迭代器失效及拷贝问题
【C++进阶】深入STL之vector:深入研究迭代器失效及拷贝问题
155 0