命名空间
变体
操作

std::reverse_iterator

来自 cppreference.com
< cpp‎ | iterator
 
 
迭代器库
迭代器概念
迭代器基元
算法概念和实用程序
间接可调用概念
通用算法需求
(C++20)
(C++20)
(C++20)
实用程序
(C++20)
迭代器适配器
范围访问
(C++11)(C++14)
(C++14)(C++14)  
(C++11)(C++14)
(C++14)(C++14)  
(C++17)(C++20)
(C++17)
(C++17)
 
 
定义在头文件 <iterator>
template< class Iter >
class reverse_iterator;

std::reverse_iterator 是一个迭代器适配器,它反转给定迭代器的方向,该迭代器必须至少是 LegacyBidirectionalIterator 或模型 bidirectional_iterator(自 C++20 起)。换句话说,当提供双向迭代器时,std::reverse_iterator 会生成一个新的迭代器,该迭代器从由底层双向迭代器定义的序列的末尾移动到开头。

对于从迭代器 r 构造的反向迭代器 i,关系 &*r == &*(i - 1) 始终为 true(只要 r可解引用的);因此,从末尾后一个迭代器构造的反向迭代器会解引用到序列中的最后一个元素。

这是标准库容器的 rbegin()rend() 成员函数返回的迭代器。

range-rbegin-rend.svg

内容

[编辑] 成员类型

成员类型 定义
iterator_type Iter
iterator_category std::iterator_traits<Iter>::iterator_category
value_type std::iterator_traits<Iter>::value_type
difference_type std::iterator_traits<Iter>::difference_type
pointer std::iterator_traits<Iter>::pointer
reference std::iterator_traits<Iter>::reference
(直到 C++20)
成员类型 定义
iterator_type Iter
iterator_concept 如果 Iter 模型 std::random_access_iterator,则为 std::random_access_iterator_tag。否则,为 std::bidirectional_iterator_tag
iterator_category 如果 std::iterator_traits<Iter>::iterator_category 模型 std::derived_from<std::random_access_iterator_tag>,则为 std::random_access_iterator_tag。否则,为 std::iterator_traits<Iter>::iterator_category
value_type std::iter_value_t<Iter>
difference_type std::iter_difference_t<Iter>
pointer std::iterator_traits<Iter>::pointer
reference std::iter_reference_t<Iter>
(自 C++20 起)

成员类型 iterator_categoryvalue_typedifference_typepointerreference 需要通过继承 std::iterator<
    std::iterator_traits<Iter>::iterator_category,
    std::iterator_traits<Iter>::value_type,
    std::iterator_traits<Iter>::difference_type,
    std::iterator_traits<Iter>::pointer,
    std::iterator_traits<Iter>::reference
>
获得。

(直到 C++17)

[编辑] 成员函数

构造一个新的迭代器适配器
(公有成员函数) [编辑]
为另一个迭代器适配器赋值
(公有成员函数) [编辑]
访问底层迭代器
(公有成员函数) [编辑]
访问所指向的元素
(公有成员函数) [编辑]
通过索引访问元素
(公有成员函数) [编辑]
递进或递减迭代器
(公有成员函数) [编辑]

[编辑] 成员对象

成员名称 定义
current (受保护) 底层迭代器,base() 返回其副本

[编辑] 非成员函数

比较底层迭代器
(函数模板) [编辑]
递进迭代器
(函数模板) [编辑]
计算两个迭代器适配器之间的距离
(函数模板) [编辑]
(C++20)
将调整后的底层迭代器解引用结果转换为其关联的右值引用类型
(函数) [编辑]
(C++20)
交换两个调整后的底层迭代器指向的对象
(函数模板) [编辑]
创建一个 std::reverse_iterator,其类型根据参数推断
(函数模板) [编辑]

[编辑] 辅助模板

template< class Iterator1, class Iterator2 >

    requires (!std::sized_sentinel_for<Iterator1, Iterator2>)
inline constexpr bool disable_sized_sentinel_for<
    std::reverse_iterator<Iterator1>,

    std::reverse_iterator<Iterator2>> = true;
(自 C++20 起)

std::disable_sized_sentinel_for 的偏特化防止 reverse_iterator 的特化满足 sized_sentinel_for,如果其底层迭代器不满足该概念。

[编辑] 可能的实现

以下是侧重于内部迭代器存储方式的实现,仅在通过 operator* 获取内容时才调用 std::prev

template<class It>
class reverse_iterator
{
protected:
    It current = It();
public:
    reverse_iterator() = default;
    constexpr explicit reverse_iterator(It itr) : current(itr) {}
    template<class U>
        requires (!std::is_same_v<U, It> && std::convertible_to<const U&, It>)
    constexpr explicit reverse_iterator(const U& other) : current(other.base()) {}
 
    constexpr decltype(auto) operator*() const
    {
        return *std::prev(current); // <== returns the content of prev
    }
 
    constexpr reverse_iterator& operator++() { --current; return *this; }
    constexpr reverse_iterator operator++(int) { auto tmp = *this; ++(*this); return tmp; }
 
    constexpr reverse_iterator& operator--() { ++current; return *this; }
    constexpr reverse_iterator operator--(int) { auto tmp = *this; --(*this); return tmp; }
 
    constexpr It base() const { return current; }
 
    // Other member functions, friend functions, and member typedefs are not shown here.
};

[编辑] 注意

std::reverse_iterator 不适用于其解引用返回对 *this 成员的引用的迭代器(所谓的“存储迭代器”)。存储迭代器的示例是 MSVC STLstd::filesystem::path::iterator

[编辑] 示例

#include <cstddef>
#include <iostream>
#include <iterator>
 
template<typename T, std::size_t SIZE>
class Stack
{
    T arr[SIZE];
    std::size_t pos = 0;
public:
    T pop()
    {
        return arr[--pos];
    }
 
    Stack& push(const T& t)
    {
        arr[pos++] = t;
        return *this;
    }
 
    // we wish that looping on Stack would be in LIFO order
    // thus we use std::reverse_iterator as an adaptor to existing iterators
    // (which are in this case the simple pointers: [arr, arr + pos)
    auto begin() { return std::reverse_iterator(arr + pos); }
    auto end() { return std::reverse_iterator(arr); }
};
 
int main()
{
    Stack<int, 8> s;
    s.push(5).push(15).push(25).push(35);
    for (int val : s)
        std::cout << val << ' ';
    std::cout << '\n';
}

输出

35 25 15 5

[编辑] 另请参阅

创建一个 std::reverse_iterator,其类型根据参数推断
(函数模板) [编辑]
(C++17 中已弃用)
基类,简化简单迭代器所需类型的定义
(类模板) [编辑]