Namespaces
Variants

std:: reverse_iterator

From cppreference.net
Iterator library
Iterator concepts
Iterator primitives
Algorithm concepts and utilities
Indirect callable concepts
Common algorithm requirements
(C++20)
(C++20)
(C++20)
Utilities
(C++20)
Iterator adaptors
Range access
(C++11) (C++14)
(C++14) (C++14)
(C++11) (C++14)
(C++14) (C++14)
(C++17) (C++20)
(C++17)
(C++17)
Défini dans l'en-tête <iterator>
template < class Iter >
class reverse_iterator ;

std::reverse_iterator est un adaptateur d'itérateur qui inverse la direction d'un itérateur donné, qui doit être au moins un LegacyBidirectionalIterator ou modéliser bidirectional_iterator (depuis C++20) . En d'autres termes, lorsqu'il est fourni avec un itérateur bidirectionnel, std::reverse_iterator produit un nouvel itérateur qui se déplace de la fin vers le début de la séquence définie par l'itérateur bidirectionnel sous-jacent.

Pour un itérateur inverse r construit à partir d'un itérateur i , la relation & * r == & * ( i - 1 ) est toujours true (tant que r est déréférençable ) ; ainsi un itérateur inverse construit à partir d'un itérateur pointant après le dernier élément déréférence vers le dernier élément d'une séquence.

Ceci est l'itérateur retourné par les fonctions membres rbegin() et rend() des conteneurs de la bibliothèque standard .

range-rbegin-rend.svg

Table des matières

Types imbriqués

Type Définition
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
(jusqu'en C++20)
Type Définition
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 >
(depuis C++20)
  1. 1.0 1.1 La définition est fournie par la spécialisation de base std::iterator jusqu'à C++17.

Membres de données

Membre Description
Iter current l'itérateur sous-jacent
(objet membre protégé)

Fonctions membres

construit un nouveau reverse_iterator
(fonction membre publique)
assigne un autre reverse_iterator
(fonction membre publique)
accède à l'itérateur sous-jacent
(fonction membre publique)
accède à l'élément pointé
(fonction membre publique)
accède à un élément par index
(fonction membre publique)
avance ou décrémente le reverse_iterator
(fonction membre publique)

Fonctions non membres

compare les itérateurs sous-jacents
(modèle de fonction)
avance l'itérateur
(modèle de fonction)
calcule la distance entre deux adaptateurs d'itérateur
(modèle de fonction)
(C++20)
convertit le résultat du déréférencement de l'itérateur sous-jacent ajusté en son type de référence rvalue associé
(fonction)
(C++20)
échange les objets pointés par deux itérateurs sous-jacents ajustés
(modèle de fonction)
crée un std::reverse_iterator dont le type est déduit de l'argument
(modèle de fonction)

Modèles d'assistance

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 ;
(depuis C++20)

Cette spécialisation partielle de std::disable_sized_sentinel_for empêche les spécialisations de reverse_iterator de satisfaire sized_sentinel_for si leurs itérateurs sous-jacents ne satisfont pas le concept.

Implémentation possible

Voici une implémentation partielle se concentrant sur la manière dont l'itérateur interne est stocké, appelant std::prev uniquement lorsque le contenu est récupéré via operator * .

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); // <== retourne le contenu de 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; }
    // Les autres fonctions membres, fonctions amies et typedefs membres ne sont pas affichés ici.
};

Notes

std::reverse_iterator ne fonctionne pas avec les itérateurs dont le déréférencement renvoie une référence à un membre de * this (appelés « itérateurs de stockage »). Un exemple d'itérateur de stockage est celui de MSVC STL std::filesystem::path::iterator .

Exemple

#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;
    }
    // nous souhaitons que le parcours de Stack soit dans l'ordre LIFO
    // donc nous utilisons std::reverse_iterator comme adaptateur aux itérateurs existants
    // (qui sont dans ce cas des pointeurs simples : [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';
}

Sortie :

35 25 15 5

Voir aussi

crée un std::reverse_iterator dont le type est déduit de l'argument
(modèle de fonction)
(obsolète en C++17)
classe de base pour faciliter la définition des types requis pour les itérateurs simples
(modèle de classe)