Compartir vía


transform_view (Clase, Biblioteca estándar de C++)

Vista de elementos, cada uno de los cuales es una transformación de un elemento en el intervalo especificado.

Sintaxis

template<input_range V, move_constructible F>
    requires view<V> && is_object_v<F> &&
    regular_invocable<F&, range_reference_t<V>> &&
    can-reference<invoke_result_t<F&, range_reference_t<V>>>
class transform_view : public view_interface<transform_view<V, F>>;

Parámetros de plantilla

F
Tipo del objeto de función que transforma los elementos.

V
Tipo de la vista subyacente.

Características de la vista

Para obtener una descripción de las siguientes entradas, vea View class characteristics (Ver características de clase).

Característica Descripción
Adaptador de rango views::transform
Intervalo subyacente Debe satisfacer input_range o superior
Tipo de elemento Igual que el tipo de valor devuelto de la función de transformación.
Ver categoría de iterador Admite input_range hasta random_access_range, dependiendo del intervalo subyacente.
Tamaño Solo si el intervalo subyacente cumple sized_range
Es const-iterable Solo si el intervalo subyacente es const iterable y la transformación funciona en const referencias.
Rango común Solo si el intervalo subyacente cumple common_range
Intervalo prestado No

Miembros

Funciones miembro Descripción
ConstructoresC++20 Construya la vista.
baseC++20 Obtenga el intervalo subyacente.
beginC++20 Obtenga un iterador al primer elemento.
endC++20 Obtenga el sentinel al final de la vista.
sizeC++20 Obtiene el número de elementos. El intervalo subyacente debe satisfacer sized_range.
Heredado de view_interface Descripción
backC++20 Obtenga el último elemento.
emptyC++20 Compruebe si la vista está vacía.
frontC++20 Obtiene el primer elemento.
operator boolC++20 Compruebe si la vista no está vacía.
operator[]C++20 Obtiene el elemento que se encuentra en la posición especificada.

Requisitos

Encabezado: <ranges> (desde C++20)

Espacio de nombres: std::ranges

Opción del compilador: /std:c++20 o posterior es necesaria.

Constructores

Construcción de una instancia de transform_view

1) transform_view() requires default_initializable<V>
         && default_initializable<F> = default;
2) constexpr transform_view(V base, F func);

Parámetros

base
Vista subyacente.

func
Función que transforma cada elemento.

Para obtener información sobre los tipos de parámetros de plantilla, consulte Parámetros de plantilla.

Valor devuelto

Instancia de transform_view.

Comentarios

La mejor manera de crear un transform_view es usar el adaptador de views::transform rango. Los adaptadores de rango son la manera prevista de crear clases de vista. Los tipos de vista se exponen en caso de que desee crear su propio tipo de vista personalizado.

1) Cree un valor inicializado transform_view. La función de transformación y la vista subyacente deben ser inicializables de forma predeterminada.
2) Mueva la construcción transform_view a partir de una base vista y una función funcde transformación . Tanto como base func se mueven a través de std::move().

Ejemplo: transform_view

// requires /std:c++20 or later
#include <ranges>
#include <iostream>
#include <vector>
#include <chrono>

using namespace std;
using namespace chrono;

void print(auto v)
{
    for (auto x : v)
    {
        cout << x << ' ';
    }
    cout << '\n';
}

struct classes
{
    string className;
    weekday startDay;
};

int main()
{
    std::vector<int> v{0, 1, 2, 3, -4, 5, 6};

    // outputs 0 2 4 6 -8 10 12
    print(v | std::views::transform([](int i) {return i * 2; }));

    // ---- Modify the elements in the collection by returning a reference to the element to transform

    std::vector<classes> theClasses = {
        {"Math", Monday},
        {"English", Wednesday},
        {"History", Monday},
        {"Science", Wednesday},
        {"Art", Friday},
        {"Music", Thursday}
    };

    // lambda to get a reference to the day of the week for a class
    auto getDay = [](classes& c) -> weekday&
    {
        return c.startDay;
    };

    // If a class starts on Monday, change it to Tuesday
    for (auto&& startDay : theClasses | std::views::transform(getDay))
    {
        // modify the startDay in the collection
        if (startDay == Monday)
        {
            startDay = Tuesday;
        }
    }

    // output classes and start times
    for (auto c : theClasses)
    {
        std::cout << c.className << " : " << c.startDay << '\n';
    }
}
0 2 4 6 -8 10 12
Math : Tue
English : Wed
History : Tue
Science : Wed
Art : Fri
Music : Thu

base

Obtenga la vista subyacente.

// Uses a copy constructor to return the underlying view
constexpr V base() const& requires std::copy_constructible<V>;

// Uses std::move() to return the underlying view
constexpr V base() &&;

Parámetros

Ninguno.

Devoluciones

Vista subyacente.

begin

Obtenga un iterador al primer elemento de la vista.

constexpr auto begin();

Valor devuelto

Iterador que apunta al primer elemento de la vista. El comportamiento no está definido si la vista no tiene un predicado.

Imagen de un vector con los elementos 10, 20 y 30. El primer elemento contiene 10 y se etiqueta begin(). El último elemento contiene 30 y se etiqueta como

end

Obtenga el sentinel al final de la vista.

constexpr auto end()

Valor devuelto

Sentinel que sigue al último elemento de la vista:

Imagen de un vector con los elementos 10, 20 y 30. El primer elemento contiene 10 y se etiqueta begin(). El último elemento contiene 30 y se etiqueta como

size

Obtiene el número de elementos de la vista.

constexpr auto size() requires ranges::sized_range<V>;
constexpr auto size() const requires ranges::sized_range<const V>;

Parámetros

Ninguno.

Valor devuelto

Número de elementos de la vista.

Consulte también

<ranges>
filter adaptador de rango
ver clases