std::reverse_iterator

来自cppreference.com
< cpp‎ | iterator
 
 
迭代器库
迭代器概念
迭代器原语
算法概念与工具
间接可调用概念
常用算法要求
工具
迭代器适配器
流迭代器
迭代器定制点
迭代器操作
(C++11)
(C++11)
范围访问
(C++11)(C++14)
(C++11)(C++14)
(C++17)(C++20)
(C++14)(C++14)
(C++14)(C++14)
(C++17)
(C++17)
 
 
定义于头文件 <iterator>
template< class Iter >

class reverse_iterator : public std::iterator<
                           typename std::iterator_traits<Iter>::iterator_category,
                           typename std::iterator_traits<Iter>::value_type,
                           typename std::iterator_traits<Iter>::difference_type,
                           typename std::iterator_traits<Iter>::pointer,

                           typename std::iterator_traits<Iter>::reference >
(C++17 前)
template< class Iter >
class reverse_iterator;
(C++17 起)

std::reverse_iterator 是一个反转给定必须至少是老式双向迭代器 (LegacyBidirectionalIterator) 或实现 bidirectional_iterator (C++20 起)的迭代器方向的适配器。换言之,提供双向迭代器时, std::reverse_iterator 产生一个新的迭代器,它从底层的双向迭代器所定义的序列的末尾移动到开端。

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

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

range-rbegin-rend.svg

成员类型

成员类型 定义
iterator_type Iter
iterator_concept(C++20) Iter 实现 std::random_access_iterator ,则为 std::random_access_iterator_tag 。否则为 std::bidirectional_iterator_tag
iterator_category

std::iterator_traits<Iter>::iterator_category

(C++20 前)

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

(C++20 起)
value_type

std::iterator_traits<Iter>::value_type

(C++20 前)

std::iter_value_t<Iter>

(C++20 起)
difference_type

std::iterator_traits<Iter>::difference_type

(C++20 前)

std::iter_difference_t<Iter>

(C++20 起)
pointer std::iterator_traits<Iter>::pointer
reference

std::iterator_traits<Iter>::reference

(C++20 前)

std::iter_reference_t<Iter>

(C++20 起)

要求通过从 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
>
继承获得成员类型 iterator_categoryvalue_typedifference_typepointerreference

(C++17 前)

成员函数

构造新的迭代器适配器
(公开成员函数)
赋值另一迭代器适配器
(公开成员函数)
访问底层迭代器
(公开成员函数)
访问被指向的元素
(公开成员函数)
按索引访问元素
(公开成员函数)
推进或回退迭代器
(公开成员函数)

成员对象

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

非成员函数

创建拥有从实参推出的类型的 std::reverse_iterator
(函数模板)
比较底层迭代器
(函数模板)
令迭代器前进
(函数模板)
计算两个迭代器适配器间的距离
(函数模板)
(C++20)
转型解引用调整后的底层迭代器的结果为其所关联的右值引用类型
(函数)
(C++20)
交换二个调整后的底层迭代器所指向的对象
(函数模板)

辅助模板

template< class Iterator1, class Iterator2 >

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

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

reverse_iterator 的特化的底层迭代器不满足 sized_sentinel_for ,则 std::disable_sentinel_for 的此偏特化阻止这些特化满足该概念。

注解

std::reverse_iterator 不可作用于解引用返回到 *this 成员的迭代器(是谓“贮藏迭代器”)。贮藏迭代器的一个例子是 std::filesystem::path::iterator

示例

#include <iostream>
#include <string>
#include <iterator>
 
int main()
{
    std::string s = "Hello, world";
    std::reverse_iterator<std::string::iterator> r = s.rbegin();
    r[7] = 'O'; // 以 'O' 替换 'o'
    r += 7; // 迭代器现在指向 'O'
    std::string rev(r, s.rend());
    std::cout << rev << '\n';
}

输出:

OlleH

参阅

(C++17 中弃用)
用于简化简单的迭代器的必要类型定义的基类
(类模板)