Espacios de nombres
Variantes
Acciones

std::reverse_iterator

De cppreference.com
< cpp‎ | iterator
 
 
Biblioteca de iteradores
Conceptos de iteradores
Primitivas de iteradores
Conceptos de algoritmos y servicios
Conceptos invocables indirectos
Requerimientos comunes de algoritmos
Servicios
Adaptadores de iteradores
Iteradores de flujos
Puntos de personalización de iteradores
Operaciones de iteradores
(C++11)
(C++11)
Acceso a rangos
(C++11)(C++14)
(C++11)(C++14)
(C++17)(C++20)
(C++14)(C++14)
(C++14)(C++14)
(C++17)
(C++17)
 
std::reverse_iterator
Las funciones miembro
Original:
Member functions
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
Terceros funciones
Original:
Non-member functions
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
 
Definido en el archivo de encabezado <iterator>
template< class Iter >
class reverse_iterator;

std::reverse_iterator es un adaptador de iterador que invierte la dirección de un iterador determinado, que debe ser al menos un IteradorBidireccionalLegado o modelar bidirectional_iterator (desde C++20). En otras palabras, cuando se le proporciona un iterador bidireccional, std::reverse_iterator produce un nuevo iterador que se mueve desde el final hasta el comienzo 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) es siempre true (siempre que r sea desreferenciable); por lo tanto, un iterador inverso construido a partir de un iterador un paso después 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

Contenido

[editar] 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 la proporciona la especialización base std::iterator hasta C++17.

[editar] Datos miembro

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

[editar] Funciones miembro

construye un nuevo adaptador iterador
Original:
constructs a new iterator adaptor
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.

(función miembro pública) [editar]
asigna otro iterador
Original:
assigns another iterator
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.

(función miembro pública) [editar]
accede el iterador subyacente
Original:
accesses the underlying iterator
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.

(función miembro pública) [editar]
accede al elemento apuntado
(función miembro pública) [editar]
obtiene la referencia rvalue al elemento indexado
(función miembro pública) [editar]
avances o disminuye el iterador
Original:
advances or decrements the iterator
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.

(función miembro pública) [editar]

[editar] Funciones no miembro

compara los iteradores subyacentes
(plantilla de función) [editar]
avanza el iterador
Original:
advances the iterator
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.

(plantilla de función) [editar]
calcula la distancia entre dos adaptadores iterador
Original:
computes the distance between two iterator adaptors
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.

(plantilla de función) [editar]
(C++20)
Convierte el resultado de desreferenciar el iterador subyacente ajustado a su tipo referencia rvalue asociado
(plantilla de función) [editar]
(C++20)
Intercambia los objetos a los que apuntan dos iteradores subyacentes ajustados
(plantilla de función) [editar]
Crea un std::reverse_iterator del tipo inferido a partir del argumento.
(plantilla de función) [editar]

[editar] 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.

[editar] Posible implementación

A continuación se muestra 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 obtiene a través de 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 definiciones de tipos miembro no se muestran aquí.
};

[editar] Notas

std::reverse_iterator no funciona con iteradores cuya desreferenciación devuelve una referencia a un miembro de *this (los llamados "iteradores de almacenamiento"). Un ejemplo de un iterador de almacenamiento es std::filesystem::path::iterator de STL de MSVC.

[editar] 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;
    }
 
    // deseamos que el bucle en Stack se realice en orden LIFO
    // por lo tanto, usamos std::reverse_iterator como un adaptador
    // para los iteradores existentes
    // (que en este caso son los punteros 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';
}

Salida:

35 25 15 5

[editar] Véase también

Crea un std::reverse_iterator del tipo inferido a partir del argumento.
(plantilla de función) [editar]
El iterador básico.
(plantilla de clase) [editar]