std::ranges::views::reverse, std::ranges::reverse_view
Definido en el archivo de encabezado <ranges>
|
||
template< ranges::view V > requires ranges::bidirectional_range<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 */ |
(desde C++20) | |
- e.base(), si el tipo de
e
es una especialización (posiblemente calificada-cv) dereverse_view
; - de lo contrario, si el tipo de e es (posiblemente calificado-cv) ranges::subrange<std::reverse_iterator<I>, std::reverse_iterator<I>, K> para algún tipo iterador
I
y valorK
de tiporanges::subrange_kind
:
- ranges::subrange<I, I, K>(e.end().base(), e.begin().base(), e.size()), si
K
esranges::subrange_kind::sized
; - de lo contrario ranges::subrange<I, I, K>(e.end().base(), e.begin().base());
- ranges::subrange<I, I, K>(e.end().base(), e.begin().base(), e.size()), si
- 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.
Contenido |
[editar] 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.
[editar] 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
V
no modelacommon_range
.
[editar] 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 std::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
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
constexpr V base() const& requires std::copy_constructible<V>; |
(1) | (desde C++20) |
constexpr V base() &&; |
(2) | (desde C++20) |
Devuelve la vista subyacente.
std::ranges::reverse_view::begin
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) |
range
, esta función almacena en caché el resultado dentro del objeto de caché para usarlo en llamadas posteriores.std::ranges::reverse_view::end
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
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.
[editar] Guías de deducción
template<class R> reverse_view(R&&) -> reverse_view<views::all_t<R>>; |
(desde C++20) | |
[editar] Plantillas auxiliares
template<class T> inline constexpr bool enable_borrowed_range<std::ranges::reverse_view<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.
[editar] 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
[editar] 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.
|
[editar] 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) |