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)
Definido en el encabezado <iterator>
template < class Iter >
class reverse_iterator ;

std::reverse_iterator es un adaptador de iterador que invierte la dirección de un iterador dado, que debe ser al menos un LegacyBidirectionalIterator o modelar bidirectional_iterator (desde C++20) . En otras palabras, cuando se proporciona con un iterador bidireccional, std::reverse_iterator produce un nuevo iterador que se mueve desde el final hasta el principio de la secuencia definida por el iterador bidireccional subyacente.

Para un iterador inverso r construido a partir de un iterador i , la relación & * r == & * ( i - 1 ) siempre es true (siempre que r sea dereferenciable ); por lo tanto, un iterador inverso construido a partir de un iterador que apunta más allá del final desreferencia al último elemento de una secuencia.

Este es el iterador devuelto por las funciones miembro rbegin() y rend() de los contenedores de la biblioteca estándar .

range-rbegin-rend.svg

Contenidos

Tipos anidados

Tipo Definición
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
(hasta C++20)
Tipo Definición
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 >
(desde C++20)
  1. 1.0 1.1 La definición es proporcionada por la especialización de la base std::iterator hasta C++17.

Miembros de datos

Miembro Descripción
Iter current el iterador subyacente
(objeto miembro protegido)

Funciones miembro

construye un nuevo reverse_iterator
(función de miembro pública)
asigna otro reverse_iterator
(función de miembro pública)
accede al iterador subyacente
(función de miembro pública)
accede al elemento apuntado
(función de miembro pública)
accede a un elemento por índice
(función de miembro pública)
avanza o decrementa el reverse_iterator
(función de miembro pública)

Funciones no miembro

compara los iteradores subyacentes
(plantilla de función)
avanza el iterador
(plantilla de función)
calcula la distancia entre dos adaptadores de iterador
(plantilla de función)
(C++20)
convierte el resultado de desreferenciar el iterador subyacente ajustado a su tipo de referencia de valor r asociado
(función)
(C++20)
intercambia los objetos apuntados por dos iteradores subyacentes ajustados
(plantilla de función)
crea un std::reverse_iterator de tipo inferido del argumento
(plantilla de función)

Plantillas auxiliares

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

Esta especialización parcial de std::disable_sized_sentinel_for evita que las especializaciones de reverse_iterator satisfagan sized_sentinel_for si sus iteradores subyacentes no satisfacen el concepto.

Implementación posible

A continuación se presenta una implementación parcial que se centra en la forma en que se almacena el iterador interno, llamando a std::prev solo cuando el contenido se recupera mediante 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); // <== devuelve el contenido 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; }
    // Otras funciones miembro, funciones amigas y typedefs de miembro no se muestran aquí.
};

Notas

std::reverse_iterator no funciona con iteradores cuyo desreferenciamiento retorna una referencia a un miembro de * this (los llamados "stashing iterators"). Un ejemplo de stashing iterator es MSVC STL's std::filesystem::path::iterator .

Ejemplo

#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';
}

Salida:

35 25 15 5

Véase también

crea un std::reverse_iterator del tipo inferido del argumento
(plantilla de función)
(obsoleto en C++17)
clase base para facilitar la definición de tipos requeridos para iteradores simples
(plantilla de clase)