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.
Contenido |
[editar] Tipos anidados
|
(hasta C++20) | ||||||||||||||||
|
(desde C++20) |
- ↑ 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) | |
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) |
[editar] 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) |
[editar] Plantillas auxiliares
template< class Iterator1, class Iterator2 > requires (!std::sized_sentinel_for<Iterator1, Iterator2>) |
(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
(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) |