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】之反向迭代器,到这里就介绍结束了,本篇文章对你由帮助的话,期待大佬们的三连,你们的支持是我最大的动力!

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

目录
相关文章
|
13天前
|
编译器 C语言 C++
【c++丨STL】list模拟实现(附源码)
本文介绍了如何模拟实现C++中的`list`容器。`list`底层采用双向带头循环链表结构,相较于`vector`和`string`更为复杂。文章首先回顾了`list`的基本结构和常用接口,然后详细讲解了节点、迭代器及容器的实现过程。 最终,通过这些步骤,我们成功模拟实现了`list`容器的功能。文章最后提供了完整的代码实现,并简要总结了实现过程中的关键点。 如果你对双向链表或`list`的底层实现感兴趣,建议先掌握相关基础知识后再阅读本文,以便更好地理解内容。
18 1
|
26天前
|
算法 C语言 C++
【c++丨STL】list的使用
本文介绍了STL容器`list`的使用方法及其主要功能。`list`是一种双向链表结构,适用于频繁的插入和删除操作。文章详细讲解了`list`的构造函数、析构函数、赋值重载、迭代器、容量接口、元素访问接口、增删查改操作以及一些特有的操作接口如`splice`、`remove_if`、`unique`、`merge`、`sort`和`reverse`。通过示例代码,读者可以更好地理解如何使用这些接口。最后,作者总结了`list`的特点和适用场景,并预告了后续关于`list`模拟实现的文章。
46 7
|
2月前
|
存储 编译器 C语言
【c++丨STL】vector的使用
本文介绍了C++ STL中的`vector`容器,包括其基本概念、主要接口及其使用方法。`vector`是一种动态数组,能够根据需要自动调整大小,提供了丰富的操作接口,如增删查改等。文章详细解释了`vector`的构造函数、赋值运算符、容量接口、迭代器接口、元素访问接口以及一些常用的增删操作函数。最后,还展示了如何使用`vector`创建字符串数组,体现了`vector`在实际编程中的灵活性和实用性。
80 4
|
2月前
|
C语言 C++ 容器
【c++丨STL】string模拟实现(附源码)
本文详细介绍了如何模拟实现C++ STL中的`string`类,包括其构造函数、拷贝构造、赋值重载、析构函数等基本功能,以及字符串的插入、删除、查找、比较等操作。文章还展示了如何实现输入输出流操作符,使自定义的`string`类能够方便地与`cin`和`cout`配合使用。通过这些实现,读者不仅能加深对`string`类的理解,还能提升对C++编程技巧的掌握。
88 5
|
2月前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
69 2
|
2月前
|
存储 算法 Linux
【c++】STL简介
本文介绍了C++标准模板库(STL)的基本概念、组成部分及学习方法,强调了STL在提高编程效率和代码复用性方面的重要性。文章详细解析了STL的六大组件:容器、算法、迭代器、仿函数、配接器和空间配置器,并提出了学习STL的三个层次,旨在帮助读者深入理解和掌握STL。
68 0
|
29天前
|
存储 编译器 C语言
【c++丨STL】vector模拟实现
本文深入探讨了 `vector` 的底层实现原理,并尝试模拟实现其结构及常用接口。首先介绍了 `vector` 的底层是动态顺序表,使用三个迭代器(指针)来维护数组,分别为 `start`、`finish` 和 `end_of_storage`。接着详细讲解了如何实现 `vector` 的各种构造函数、析构函数、容量接口、迭代器接口、插入和删除操作等。最后提供了完整的模拟实现代码,帮助读者更好地理解和掌握 `vector` 的实现细节。
38 0
|
3月前
|
存储 程序员 C++
C++常用基础知识—STL库(2)
C++常用基础知识—STL库(2)
90 5
|
3月前
|
存储 自然语言处理 程序员
C++常用基础知识—STL库(1)
C++常用基础知识—STL库(1)
87 1
|
3月前
|
算法 数据处理 C++
c++ STL划分算法;partition()、partition_copy()、stable_partition()、partition_point()详解
这些算法是C++ STL中处理和组织数据的强大工具,能够高效地实现复杂的数据处理逻辑。理解它们的差异和应用场景,将有助于编写更加高效和清晰的C++代码。
56 0