Requisitos denominados de C++: ContenedorReversible
Un ContenedorReversible es un Contenedor que tiene iteradores que cumplen con los requisitos de IteradorBidireccionalLegado o IteradorDeAccesoAleatorioLegado. Dichos iteradores permiten que un ContenedorReversible se pueda iterar en sentido inverso.
Requisitos
Un tipo satisface ContenedorReversible si satisface Contenedor, su tipo de iterador pertenece a las categorías de iteradores bidireccionales o de acceso aleatorio y, dados los siguientes tipos y valores, se satisfacen los requisitos semánticos y de complejidad de las siguientes tablas:
| Tipo | Definición |
X
|
un tipo ContenedorReversible |
T
|
el tipo de valor de X
|
| Valor | Definición |
a
|
un valor de tipo X
|
Tipos
| Nombre | Tipo | Requisitos |
|---|---|---|
typename X::reverse_iterator
|
std::reverse_iterator<X::iterator>
|
un tipo iterador cuyo tipo de valor es T
|
typename X::const_reverse_iterator
|
std::reverse_iterator<X::const_iterator>
|
un tipo iterador constante cuyo tipo de valor es T
|
Expresiones
Los tipos reverse_iterator y const_reverse_iterator en la siguiente tabla designan typename X::reverse_iterator y typename X::const_reverse_iterator respectivamente.
| Expresión | Tipo | Semántica | Complejidad |
|---|---|---|---|
a.rbegin()
|
reverse_iteratorconst_reverse_iterator para a constante
|
reverse_iterator(a.end())
|
Constante |
a.rend()
|
reverse_iteratorconst_reverse_iterator para a constante
|
reverse_iterator(a.begin())
|
Constante |
a.crbegin()
|
const_reverse_iterator
|
const_cast<const X&>(a).rbegin()
|
Constante |
a.crend()
|
const_reverse_iterator
|
const_cast<const X&>(a).rend()
|
Constante |
Biblioteca estándar
- std::array
- std::deque
- std::list
- std::vector
- std::map
- std::multimap
- std::set
- std::multiset
Ejemplo
El siguiente ejemplo itera sobre un std::vector (que tiene iteradores de acceso aleatorio) en orden inverso.
#include <iostream>
#include <vector>
int main()
{
std::vector<int> v = {3, 1, 4, 1, 5, 9};
for (std::vector<int>::const_reverse_iterator i{v.crbegin()}; i != v.crend(); ++i)
std::cout << *i << ' ';
std::cout << '\n';
}
Salida:
9 5 1 4 1 3
Informes de defectos
Los siguientes informes de defectos de cambio de comportamiento se aplicaron de manera retroactiva a los estándares de C++ publicados anteriormente.
| ID | Aplicado a | Comportamiento según lo publicado | Comportamiento correcto |
|---|---|---|---|
| LWG 2105 | C++98 | Se requería que el tipo typename X::const_reverse_iteratorfuera un tipo iterador cuyo tipo valor fuera const T.
|
Se requiere que sea un tipo iterador constante cuyo tipo valor sea T.
|