C++反向迭代器

简介: C++反向迭代器

C++反向迭代器

📟作者主页:慢热的陕西人

🌴专栏链接:C++

📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言

本博客主要内容介绍反向迭代器的概念和模拟实现一个通用的反向迭代器


1.反向迭代器的概念

我们通过学习stl库我们了解到迭代器分为正向迭代器和反向迭代器。正向迭代器适用于正向遍历该数据类型的中的所有元素。

所以反向的迭代器顾名思义,就是反向遍历该数据类型中的所有元素。

接下来我将详细讲解如何自己实现一个反向迭代器。

2.反向迭代器的模拟实现

反向迭代器的实现思路有两个:

  • 通过对正向迭代器的代码进行修改实现。
  • 采用适配器的写法原理将正向迭代器作为一个模板参数来实现。

对于上述两个方法来说:

第一种方法只适用于对应类型的正向迭代器,而第二种的实现方式可以实现一个通用的模板适用于所有的正向迭代器是双向迭代器的类型,因此我们接下来用第二种方法来实现反向迭代器。

以下是源代码:

//iterator.h
#pragma once
namespace xupt
{
   //这里我们采用将正向迭代器作为一个模板参数
    template<class Iterator,class Ref, class Ptr>
    struct Reverse_Iterator
    {
      Iterator _cur;
      typedef Reverse_Iterator<Iterator, Ref, Ptr> Self;
      Reverse_Iterator(const Iterator& it)
        :_cur(it)
      {}
      Ref operator*()
      {
        Iterator tmp = _cur;
        --tmp;
        return *tmp;
      }
      //反向迭代器的++就是正向迭代器的--
      Self& operator++()
      {
        --_cur;
        return *this;
      }
      Self& operator--()
      {
        ++_cur;
        return *this;
      }
      bool operator!=(const Self& s)
      {
        return _cur != s._cur;
      }
    };
};
//list.h
  template<class T> 
  struct list
  {
    typedef list_node<T> node;
  public:
    typedef _list_iterator<T, T&, T*> iterator;
    typedef _list_iterator<T, const T&, const T*> const_iterator;
    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_reverse_iterator rbegin() const
    {
      return const_reverse_iterator(end());
    }
    const_reverse_iterator rend() const
    {
      return const_reverse_iterator(begin());
    }
    iterator begin()
    {
      return iterator(_head->_next);
    }
    iterator end()
    {
      return iterator(_head);
    }
    const_iterator begin() const
    {
      return const_iterator(_head->_next);
    }
    const_iterator end() const
    {
      return const_iterator(_head);
    }

【注意】

这里我们看到解引用操作符的重载实现方式如下:

Ref operator*()
{
  Iterator tmp = _cur;
  --tmp;
  return *tmp;
}

为什么这里是先进行了–再进行解引用呢?

如下如所示我们可以看到因为我们采用的是rbegin对应end,rend对应begin的方法。所以我们当前迭代器指向的元素并不是我们实际想解引用的元素。

所以我们先进行了--操作才进行解引用,这样就可以得到我们想得到的元素内容了!

image-20230528163624973

到这本篇博客的内容就到此结束了。
如果觉得本篇博客内容对你有所帮助的话,可以点赞,收藏,顺便关注一下!
如果文章内容有错误,欢迎在评论区指正

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