C++【STL】之反向迭代器

简介: C++ STL 反向迭代器设计思想和模拟实现详细讲解,干货满满!

反向迭代器

前面在vector和list的模拟实现中都有讲到正向迭代器,今天我们就来讲解一下反向迭代器的思想和模拟实现,在某些场景下还是很实用的,下面正文直接开始。

1. 反向迭代器结构

反向迭代器reverse_iterator用于反向遍历容器,它也是由一个类来封装的

template<class Iterator>
struct __reverse_iterator
{
   
   
    Iterator _cur;    //正向迭代器类做成员变量
    __reverse_iterator(Iterator cur) //构造正向迭代器
        :_cur(cur)
    {
   
   }
    //...
};

STL库中反向迭代器的设计讲究完美的对称性,rbegin() 指向最后一个有效元素的下一个位置,rend() 指向第一个有效元素,与正向迭代器的指针位置刚好相反

拿vector对象举个例子

Self& operator++()
{
   
   
    --_cur; //正反迭代器,++,--反向操作
    return *this;
}

Self& operator--()
{
   
   
    ++_cur;
    return *this;
}

2. 反向迭代器实现

反向迭代器的实现主要还是依于对正向迭代器的复用,外加了一点小细节思想,这里我们实现的依旧是简易版本

2.1 多参数模板

前面在模拟实现list时,运用了多参数模板来解决const对象代码冗余问题,在反向迭代器的实现中也运用了相同原理,通过对形参传递不同的对象,变换为不同的迭代器

template<class Iterator, class Ref, class Ptr>
struct __reverse_iterator
{
   
   
    //...
};

其中Ref表示引用对象,Ptr表示指针对象

2.2 对称思想

STL大佬在设计反向迭代器时,为了追求与正向迭代器的对称,将首尾指针得到指向反向保持一致,如上图,即rbegin()end()位置,rend()begin()位置

在这样的设计下,rbegin()rend()的实现就可以直接对应复用了,而operator*()返回的就不是当前所指向的对象,而是成了上一个对象

reverse_iterator rbegin() 
{
   
    
    reverse_iterator(end()); 
}

reverse_iterator rend() 
{
   
    
    reverse_iterator(begin()); 
}

operator*()

Ref operator*()
{
   
   
    Iterator tmp = _cur;
    return *--tmp;    //返回上一个对象
}

2.3 完整代码

至于其他的实现都是复用的正向迭代器,比较简单,这里直接上完整代码,相信大佬,们一看就能明白

#pragma once
namespace Sakura
{
   
   
    template<class Iterator, class Ref, class Ptr>
    struct __reverse_iterator
    {
   
   
        typedef __reverse_iterator<Iterator, Ref, Ptr> self; //重命名
        Iterator _cur; //正向迭代器类做成员变量

        __reverse_iterator(Iterator cur) //构造正向迭代器
            :_cur(cur)
        {
   
   }

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

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

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

        self operator++(int)
        {
   
   
            self tmp(*this);
            --_cur;
            return tmp;
        }

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

        self operator--(int)
        {
   
   
            self tmp(*this);
            ++_cur;
            return tmp;
        }

        bool operator!=(const self& s)
        {
   
   
            return (_cur != s._cur);
        }

        bool operator==(const self& s)
        {
   
   
            return (_cur == s._cur);
        }
    };
}

3. 反向迭代器vector应用

vector 类中,定义出反向迭代器所需的函数即可

template<class T>
class vector
{
   
   
public:
    //反向迭代器
    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());
    }
    //...
};

4. 反向迭代器list引用

list 类中,定义出反向迭代器所需的函数即可

template<class T>
class list
{
   
   
public:
    //反向迭代器
    typedef __reverse_iterator<iterator, T&, T*> reverse_iterator;
    typedef __reverse_iterator<const_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()); 
    }
    //...
};

C++【STL】之反向迭代器,到这里就介绍结束了,本篇文章对你由帮助的话,期待大佬们的三连,你们的支持是我最大的动力!

文章有写的不足或是错误的地方,欢迎评论或私信指出,我会在第一时间改正!

目录
相关文章
|
15天前
|
存储 算法 编译器
[C++] STL简介
[C++] STL简介
11 1
|
21天前
|
存储 算法 C++
C++ STL应用宝典:高效处理数据的艺术与实战技巧大揭秘!
【8月更文挑战第22天】C++ STL(标准模板库)是一组高效的数据结构与算法集合,极大提升编程效率与代码可读性。它包括容器、迭代器、算法等组件。例如,统计文本中单词频率可用`std::map`和`std::ifstream`实现;对数据排序及找极值则可通过`std::vector`结合`std::sort`、`std::min/max_element`完成;而快速查找字符串则适合使用`std::set`配合其内置的`find`方法。这些示例展示了STL的强大功能,有助于编写简洁高效的代码。
31 2
|
22天前
|
C++ 容器
【C/C++笔记】迭代器
【C/C++笔记】迭代器
13 1
|
22天前
|
存储 安全 程序员
【C/C++笔记】迭代器范围
【C/C++笔记】迭代器范围
46 0
|
27天前
|
安全 编译器 容器
C++STL容器和智能指针
C++STL容器和智能指针
|
30天前
|
算法 安全 Linux
|
2月前
|
设计模式 算法 Java
【c++】STL之stack和queue详解
【c++】STL之stack和queue详解
31 1
|
2月前
|
存储 算法 C++
【C++高阶】探索STL的瑰宝 map与set:高效数据结构的奥秘与技巧
【C++高阶】探索STL的瑰宝 map与set:高效数据结构的奥秘与技巧
45 0
|
2月前
|
C++ 容器
【C++】string类的使用①(迭代器接口begin,end,rbegin和rend)
迭代器接口是获取容器元素指针的成员函数。`begin()`返回首元素的正向迭代器,`end()`返回末元素之后的位置。`rbegin()`和`rend()`提供反向迭代器,分别指向尾元素和首元素之前。C++11增加了const版本以供只读访问。示例代码展示了如何使用这些迭代器遍历字符串。
|
2月前
|
存储 算法 数据处理
【C++】STL简介
**STL是C++标准库的关键部分,源于Alexander Stepanov的泛型编程研究。它提供了数据结构(如vector、list)和算法,是高效、通用的软件框架。STL始于惠普,后由SGI发展,现已成为C++1998标准的一部分并不断进化。它包括容器、迭代器、算法、仿函数、配接器和分配器六大组件,带来高效性、通用性和可扩展性,但也存在性能开销和学习难度。学习STL涉及理解底层数据结构、用法、实现和实践。推荐[cplusplus.com](https://cplusplus.com)作为学习资源。**