Freigeben über


transform_view Klasse (C++-Standardbibliothek)

Eine Ansicht von Elementen, von denen jede eine Transformation eines Elements im angegebenen Bereich ist.

Syntax

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>>;

Vorlagenparameter

F
Der Typ des Funktionsobjekts, das die Elemente transformiert.

V
Der Typ der zugrunde liegenden Ansicht.

Eigenschaften der Ansicht

Eine Beschreibung der folgenden Einträge finden Sie unter Anzeigen von Klassenmerkmalen

Merkmal Beschreibung
Range Adaptor views::transform
Zugrunde liegender Bereich Muss erfüllen input_range oder höher
Elementtyp Identisch mit dem Rückgabetyp der Transformationsfunktion.
Iteratorkategorie anzeigen Unterstützt input_range bis zu random_access_range, abhängig vom zugrunde liegenden Bereich
Größer eingestellt Nur, wenn der zugrunde liegende Bereich erfüllt ist sized_range
Ist const-iterierbar Nur wenn der zugrunde liegende Bereich iterierbar ist const und die Transformation auf const Verweise funktioniert.
Allgemeiner Bereich Nur, wenn der zugrunde liegende Bereich erfüllt ist common_range
Geliehener Bereich No

Member

Memberfunktionen Beschreibung
Konstruktoren C++20 Erstellen Sie die Ansicht.
baseC++20 Rufen Sie den zugrunde liegenden Bereich ab.
beginC++20 Rufen Sie einen Iterator zum ersten Element ab.
endC++20 Rufen Sie den Sentinel am Ende der Ansicht ab.
sizeC++20 Ruft die Anzahl der Elemente ab. Der zugrunde liegende Bereich muss erfüllt sein sized_range.
Geerbt von view_interface Beschreibung
backC++20 Rufen Sie das letzte Element ab.
emptyC++20 Testen Sie, ob die Ansicht leer ist.
frontC++20 Rufen Sie das erste Element ab.
operator boolC++20 Testen Sie, ob die Ansicht nicht leer ist.
operator[]C++20 Rufen Sie das Element an der angegebenen Position ab.

Anforderungen

Header: <ranges> (seit C++20)

Namespace:std::ranges

Compileroption: /std:c++20 oder höher ist erforderlich.

Konstruktoren

Erstellen einer Instanz einer transform_view

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

Parameter

base
Die zugrunde liegende Ansicht.

func
Die Funktion, die jedes Element transformiert.

Informationen zu Vorlagenparametertypen finden Sie unter Vorlagenparameter.

Rückgabewert

Eine transform_view-Instanz.

Hinweise

Die beste Methode zum Erstellen eines Steuerelements transform_view ist die Verwendung des views::transform Bereichsadapters. Bereichsadapter sind die beabsichtigte Möglichkeit zum Erstellen von Ansichtsklassen. Die Ansichtstypen werden für den Fall verfügbar gemacht, dass Sie ihren eigenen benutzerdefinierten Ansichtstyp erstellen möchten.

1) Erstellen Sie einen wertinitialisierten transform_view. Die Transformationsfunktion und die zugrunde liegende Ansicht müssen standardmäßig initialisierbar sein.
2) Verschieben Sie das transform_view Konstrukt aus einer base Ansicht und einer Transformationsfunktion func. Beide base und func werden über std::move()verschoben.

Beispiel: 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

Rufen Sie die zugrunde liegende Ansicht ab.

// 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() &&;

Parameter

Keine.

Gibt zurück

Die zugrunde liegende Ansicht.

begin

Rufen Sie einen Iterator zum ersten Element in der Ansicht ab.

constexpr auto begin();

Rückgabewert

Ein Iterator, der auf das erste Element in der Ansicht zeigt. Das Verhalten ist nicht definiert, wenn die Ansicht kein Prädikat aufweist.

Abbildung eines Vektors mit den Elementen 10, 20 und 30. Das erste Element enthält 10 und ist mit

end

Rufen Sie den Sentinel am Ende der Ansicht ab.

constexpr auto end()

Rückgabewert

Der Sentinel, der auf das letzte Element in der Ansicht folgt:

Abbildung eines Vektors mit den Elementen 10, 20 und 30. Das erste Element enthält 10 und ist mit

size

Ruft die Anzahl der Elemente in der Ansicht ab.

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

Parameter

Keine

Rückgabewert

Die Anzahl der Elemente in der Ansicht.

Siehe auch

<ranges>
filter Range Adaptor
Anzeigen von Klassen