Espacios de nombres
Variantes
Acciones

std::ranges::views::reverse, std::ranges::reverse_view

De cppreference.com
< cpp‎ | ranges
 
 
Biblioteca de rangos
Adaptadores de rangos
 
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)
1) Un adaptador de rango que representa una vista de la vista subyacente en orden inverso.
2) Objeto adaptador de rango. La expresión 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 de e es una especialización (posiblemente calificada-cv) de reverse_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 valor K de tipo ranges::subrange_kind:
  • ranges::subrange<I, I, K>(e.end().base(), e.begin().base(), e.size()), si K es ranges::subrange_kind::sized;
  • de lo contrario ranges::subrange<I, I, K>(e.end().base(), e.begin().base());
  • de lo contrario ranges::reverse_view{e}.
En otras palabras, 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 como base_, 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 modela common_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>) [editar]
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>) [editar]
(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>) [editar]
(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>) [editar]
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>) [editar]

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)
1) Inicializa por valor a base_ vía su inicializador de miembro por defecto (= V()).
2) Inicializa a 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.

1) Construye por copia el resultado a partir de la vista subyacente. Equivalente a return base_;.
2) Construye por movimiento el resultado a partir de la vista subyacente. Equivalente a return std::move(base_);.

std::ranges::reverse_view::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)
1) Devuelve 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.
2-3) Equivalente a return std::make_reverse_iterator(ranges::end(base_));.

std::ranges::reverse_view::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>> =

    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.

[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) [editar]
Invierte el orden de los elementos en un rango.
(niebloid) [editar]
Crea una copia de un rango que está invertido.
(niebloid) [editar]