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 产生一个新的迭代器,它从底层的双向迭代器所定义的序列的末尾移动到开端。

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

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

range-rbegin-rend.svg

目录

[编辑]嵌套类型

类型 定义
iterator_typeIter
iterator_categorystd::iterator_traits<Iter>::iterator_category[1]
value_typestd::iterator_traits<Iter>::value_type[1]
difference_typestd::iterator_traits<Iter>::difference_type
pointerstd::iterator_traits<Iter>::pointer
referencestd::iterator_traits<Iter>::reference
(C++20 前)
类型 定义
iterator_typeIter
iterator_concept
iterator_category
value_typestd::iter_value_t<Iter>
difference_typestd::iter_difference_t<Iter>
pointerstd::iterator_traits<Iter>::pointer
referencestd::iter_reference_t<Iter>
(C++20 起)
  1. 1.01.1在 C++17 前,此定义由作为基的 std::iterator 特化提供。

[编辑]数据成员

成员 描述
Itercurrent 底层迭代器
(受保护成员对象)

[编辑]成员函数

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

[编辑]非成员函数

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

[编辑]辅助模板

template<class Iterator1, class Iterator2 >

    requires (!std::sized_sentinal_for<Iterator1, Iterator2>)
inlineconstexprbool disable_sized_sentinel_for

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

如果 reverse_iterator 的特化的底层迭代器不满足 sized_sentinel_for,那么 std::disable_sentinel_for 的此部分特化防止这些特化满足该概念。

[编辑]可能的实现

以下是一种部分实现,它关注于内部迭代器的存储方式,仅当通过 operator* 取得了内容时才调用 std::prev

template<class It>class reverse_iterator {protected: It current = It();public: reverse_iterator()=default;constexprexplicit reverse_iterator(It itr): current(itr){}template<class U> requires (!std::is_same_v<U, It>&&std::convertible_to<const U&, It>)constexprexplicit reverse_iterator(const U& other): current(other.base()){}   constexpr decltype(auto) operator*()const{return*std::prev(current);// <== 返回 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;}   // 这里未列出其他成员函数,友元函数,和成员 typedef。};

[编辑]注解

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;}   // 我们希望以后进先出顺序在 Stack 上做循环// 因此我们对既有迭代器使用作为适配器的 std::reverse_iterator// (在这里就是简单的指针:[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 弃用)
简化简单的迭代器的必要类型定义的基类
(类模板)[编辑]
close