std:: reverse_iterator
|
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
.
Contenidos |
Tipos anidados
|
(hasta C++20) | ||||||||||||||||
|
(desde C++20) |
- ↑ 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) |
|
(C++14)
|
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
>
)
|
(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
|
(C++14)
|
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) |