std::ranges::views::reverse, std::ranges::reverse_view
| Definido en el archivo de encabezado <ranges>
|
||
template< ranges::view V > requires ranges::bidirectional_range<V> class reverse_view : public ranges::view_interface<reverse_view<V>> |
(1) | (desde C++20) |
namespace views { inline constexpr /* no especificado */ reverse = /* no especificado */; } |
(2) | (desde C++20) |
| Signatura de la llamada |
||
template< ranges::viewable_range R > requires /* véase a continuación */ constexpr ranges::view auto reverse( R&& r ); |
(desde C++20) | |
views::reverse(e) es equivalente en expresión a una de las siguientes expresiones, excepto que e se evalúa solamente una vez:
e.base(), si el tipo deees una especialización (posiblemente calificada-cv) dereverse_view;- de lo contrario, si el tipo de
ees (posiblemente calificado-cv)ranges::subrange<std::reverse_iterator<I>, std::reverse_iterator<I>, K>para algún tipo iteradorIy valorKde tiporanges::subrange_kind:
ranges::subrange<I, I, K>(e.end().base(), e.begin().base(), e.size()), siKesranges::subrange_kind::sized;- de lo contrario
ranges::subrange<I, I, K>(e.end().base(), e.begin().base());
- de lo contrario
ranges::reverse_view{e}.
views::reverse desenvuelve vistas invertidas si es posible.Una vista reverse_view siempre modela bidirectional_range y common_range, y modela borrowed_range, sized_range, o random_access_range si el tipo V de la vista subyacente modela el modelo correspondiente.
Equivalente en expresión
La expresión e es equivalente-en-expresión a la expresión f, si e y f tienen los mismos efectos, ambas potencialmente lanzan o ambas potencialmente no lanzan (es decir, noexcept (e) == noexcept(f)), y ambas son subexpresiones constantes o ambas no son subexpresiones constantes.
Datos miembro
Las implementaciones típicas de reverse_view mantienen solo uno o dos objetos miembro:
- la vista subyacente de tipo
V(que aquí se muestra comobase_, el nombre es solo de exposición), y - un objeto de caché similar a std::optional que mantiene o bien ningún valor o el iterador o posición al final de la vista subyacente, que existe solo si el tipo de la vista subyacente
Vno modelacommon_range.
Funciones miembro
(constructor) (C++20) |
Construye una vista reverse_view. (función miembro pública) |
base (C++20) |
Devuelve la vista subyacente V. (función miembro pública) |
begin (C++20) |
Devuelve el iterador al comienzo de la vista reverse_view. (función miembro pública) |
end (C++20) |
Devuelve el iterador al final de la vista reverse_view. (función miembro pública) |
size (C++20) |
Devuelve el tamaño de la vista si tiene límites. (función miembro pública) |
Heredadas de ranges::view_interface | |
(C++20) |
Devuelve si la vista derivada está vacía o no. Se proporciona si la vista derivada satisface forward_range. (función miembro pública de std::ranges::view_interface<D>)
|
(C++20) |
Devuelve si la vista derivada está vacía o no. Se proporciona si ranges::empty le es aplicable. (función miembro pública de std::ranges::view_interface<D>)
|
(C++20) |
Devuelve el primer elemento en la vista derivada. Se proporciona si la vista derivada satisface forward_range. (función miembro pública de std::ranges::view_interface<D>)
|
(C++20) |
Devuelve el último elemento en una vista derivada. Se proporciona si la vista derivada satisface bidirectional_range y common_range. (función miembro pública de std::ranges::view_interface<D>)
|
(C++20) |
Devuelve el enésimo elemento en la vista derivada. Se proporciona si la vista derivada satisface random_access_range. (función miembro pública de std::ranges::view_interface<D>)
|
std::ranges::reverse_view::reverse_view
<tbody> </tbody> reverse_view() requires std::default_initializable<V> = default; |
(1) | (desde C++20) |
constexpr reverse_view(V r); |
(2) | (desde C++20) |
base_ vía su inicializador de miembro por defecto (= V()).base_ con std::move(r).Parámetros
| r | - | Rango a invertir. |
std::ranges::reverse_view::base
<tbody> </tbody> constexpr V base() const& requires std::copy_constructible<V>; |
(1) | (desde C++20) |
constexpr V base() &&; |
(2) | (desde C++20) |
Devuelve la vista subyacente.
return base_;.return std::move(base_);.std::ranges::reverse_view::begin
<tbody> </tbody> constexpr std::reverse_iterator<ranges::iterator_t<V>> begin(); |
(1) | (desde C++20) |
constexpr std::reverse_iterator<ranges::iterator_t<V>> begin() requires ranges::common_range<V>; |
(2) | (desde C++20) |
constexpr auto begin() const requires ranges::common_range<const V>; |
(3) | (desde C++20) |
std::make_reverse_iterator(ranges::next(ranges::begin(base_), ranges::end(base_))). Para proporcionar la complejidad de tiempo constante amortizada requerida por el concepto range, esta función almacena en caché el resultado dentro del objeto de caché para usarlo en llamadas posteriores.return std::make_reverse_iterator(ranges::end(base_));.std::ranges::reverse_view::end
<tbody> </tbody> constexpr std::reverse_iterator<ranges::iterator_t<V>> end(); |
(1) | (desde C++20) |
constexpr auto end() const requires ranges::common_range<const V>; |
(2) | (desde C++20) |
Equivalente a return std::make_reverse_iterator(ranges::begin(base_));.
std::ranges::reverse_view::size
<tbody> </tbody> constexpr auto size() requires ranges::sized_range<V> { return ranges::size(base_); } |
(1) | (desde C++20) |
constexpr auto size() const requires ranges::sized_range<const V> { return ranges::size(base_); } |
(2) | (desde C++20) |
Devuelve el tamaño de la vista si la vista tiene límites.
Guías de deducción
<tbody> </tbody> template<class R> reverse_view(R&&) -> reverse_view<views::all_t<R>>; |
(desde C++20) | |
Plantillas auxiliares
<tbody> </tbody> template<class T> inline constexpr bool enable_borrowed_range<std::ranges::reverse_view<T>> = std::ranges::enable_borrowed_range<T>; |
(desde C++20) | |
Esta especialización de std::ranges::enable_borrowed_range hace que reverse_view satisfaga borrowed_range cuando la vista subyacente lo hace.
Ejemplo
#include <ranges>
#include <iostream>
int main()
{
static constexpr auto il = {3, 1, 4, 1, 5, 9};
std::ranges::reverse_view rv {il};
for (int i : rv)
std::cout << i << ' ';
std::cout << '\n';
for (int i : il | std::views::reverse)
std::cout << i << ' ';
std::cout << '\n';
// operator[] se hereda de `view_interface`
for (auto i{0U}; i != rv.size(); ++i)
std::cout << rv[i] << ' ';
std::cout << '\n';
}
Salida:
9 5 1 4 1 3
9 5 1 4 1 3
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 3494 | C++20 | reverse_view nunca era un borrowed_range
|
Es un borrowed_range si su vista subyacente lo es.
|
Véase también
| Adaptador de iterador para recorrido en orden inverso. (plantilla de clase) | |
(C++20) |
Invierte el orden de los elementos en un rango. (niebloid) |
(C++20) |
Crea una copia de un rango que está invertido. (niebloid) |