名稱空間
變體
操作

std::reverse_iterator

來自 cppreference.com
 
 
迭代器庫
迭代器概念
迭代器原語
演算法概念與工具
間接可呼叫概念
常用演算法要求
(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_type Iter
iterator_category std::iterator_traits<Iter>::iterator_category[1]
value_type std::iterator_traits<Iter>::value_type[1]
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
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 起)
  1. 1.0 1.1 此定義由基類 std::iterator 特化提供,直到 C++17。

[編輯] 資料成員

成員 描述
Iter current 底層迭代器
(protected 成員物件)

[編輯] 成員函式

構造一個新的 reverse_iterator
(public member function) [編輯]
賦值另一個 reverse_iterator
(public member function) [編輯]
訪問底層迭代器
(public member function) [編輯]
訪問指向的元素
(public member function) [編輯]
透過索引訪問元素
(public member function) [編輯]
遞增或遞減 reverse_iterator
(public member function) [編輯]

[編輯] 非成員函式

比較底層迭代器
(function template) [編輯]
前進迭代器
(function template) [編輯]
計算兩個迭代器介面卡之間的距離
(function template) [編輯]
(C++20)
將解引用後的底層迭代器的結果轉換為其關聯的右值引用型別
(function) [編輯]
(C++20)
交換兩個調整後的底層迭代器指向的物件
(function template) [編輯]
建立一個從引數推斷型別的 std::reverse_iterator
(function template) [編輯]

[編輯] 輔助模板

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 STL 的 std::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
(function template) [編輯]
(C++17 中已棄用)
基類,用於簡化簡單迭代器所需型別的定義
(類模板) [編輯]