std::reverse_iterator - cppreference.com
De cppreference.com
| Definido en el archivo de encabezado |
||
|
|
||
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. (función miembro pública) [editar] | |
asigna otro iterador Original: assigns another iterator The text has been machine-translated via Google Translate. (función miembro pública) [editar] | |
accede el iterador subyacente Original: accesses the underlying iterator The text has been machine-translated via Google Translate. (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. (función miembro pública) [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. (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. (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] |
(C++14) |
Crea un std::reverse_iterator del tipo inferido a partir del argumento. (plantilla de función) [editar] |
Plantillas auxiliares
|
|
(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: