std::reverse_iterator
| 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.
Tipos anidados
|
(hasta C++20) | ||||||||||||||||
|
(desde C++20) |
Datos miembro
| Miembro | Descripción |
Iter current
|
El iterador subyacente (objeto miembro protegido) |
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) | |
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) | |
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) | |
| accede al elemento apuntado (función miembro pública) | |
| obtiene la referencia rvalue al elemento indexado (función miembro pública) | |
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) |
Funciones no miembro
| compara los iteradores subyacentes (plantilla de función) | |
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) | |
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) | |
(C++20) |
Convierte el resultado de desreferenciar el iterador subyacente ajustado a su tipo referencia rvalue asociado (plantilla de función) |
(C++20) |
Intercambia los objetos a los que apuntan dos iteradores subyacentes ajustados (plantilla de función) |
(C++14) |
Crea un std::reverse_iterator del tipo inferido a partir del argumento. (plantilla de función) |
Plantillas auxiliares
<tbody> </tbody> 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.
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í.
};
|
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.
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
Véase también
(C++14) |
Crea un std::reverse_iterator del tipo inferido a partir del argumento. (plantilla de función) |
| El iterador básico. (plantilla de clase) |