Bagikan melalui


transform_view kelas (Pustaka Standar C++)

Tampilan elemen, yang masing-masing adalah transformasi elemen dalam rentang yang ditentukan.

Sintaks

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

Parameter template

F
Jenis objek fungsi yang mengubah elemen.

V
Jenis tampilan yang mendasar.

Melihat karakteristik

Untuk deskripsi entri berikut, lihat Menampilkan karakteristik kelas

Karakteristik Deskripsi
Adaptor rentang views::transform
Rentang yang mendasar Harus memuaskan input_range atau lebih tinggi
Jenis elemen Sama seperti jenis pengembalian fungsi transformasi.
Lihat kategori iterator Mendukung hingga random_access_range, tergantung pada rentang yang mendasar input_range
Ukuran Hanya jika rentang yang mendasar memenuhi sized_range
Apakah const-iterable Hanya jika rentang yang mendasar dapat diulang const dan transformasi berfungsi pada const referensi.
Rentang umum Hanya jika rentang yang mendasar memenuhi common_range
Rentang yang dipinjam No

Anggota

Fungsi anggota Keterangan
KonstruktorC++20 Buat tampilan.
baseC++20 Dapatkan rentang yang mendasar.
beginC++20 Dapatkan iterator ke elemen pertama.
endC++20 Dapatkan sentinel di akhir tampilan.
sizeC++20 Dapatkan jumlah elemen. Rentang yang mendasar harus memuaskan sized_range.
Diwariskan dari view_interface Keterangan
backC++20 Dapatkan elemen terakhir.
emptyC++20 Uji apakah tampilan kosong.
frontC++20 Dapatkan elemen pertama.
operator boolC++20 Uji apakah tampilan tidak kosong.
operator[]C++20 Dapatkan elemen pada posisi yang ditentukan.

Persyaratan

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

kumpulan nama XML: std::ranges

Opsi Pengkompilasi: /std:c++20 atau yang lebih baru diperlukan.

Konstruktor

Membuat instans transform_view

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

Parameter

base
Tampilan yang mendasar.

func
Fungsi yang mengubah setiap elemen.

Untuk informasi tentang jenis parameter templat, lihat Parameter templat.

Nilai hasil

Instans transform_view.

Keterangan

Cara terbaik untuk membuat adalah transform_view dengan menggunakan views::transform adaptor rentang. Adaptor rentang adalah cara yang dimaksudkan untuk membuat kelas tampilan. Jenis tampilan diekspos jika Anda ingin membuat jenis tampilan kustom Anda sendiri.

1) Buat nilai yang diinisialisasi transform_view. Fungsi transformasi dan tampilan yang mendasar harus dapat diinisialisasi secara default.
2) Pindahkan konstruksi transform_view dari base tampilan dan fungsi functransformasi . Keduanya base dan func dipindahkan melalui std::move().

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

Dapatkan tampilan yang mendasar.

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

Tidak ada.

Mengembalikan

Tampilan yang mendasar.

begin

Dapatkan iterator ke elemen pertama dalam tampilan.

constexpr auto begin();

Nilai hasil

Iterator yang menunjuk pada elemen pertama dalam tampilan. Perilaku tidak terdefinisi jika tampilan tidak memiliki predikat.

Gambar vektor dengan elemen 10, 20, dan 30. Elemen pertama berisi 10 dan diberi label begin(). Elemen terakhir berisi 30 dan diberi label 'elemen terakhir'. Kotak imajiner setelah elemen terakhir menunjukkan sentinel dan diberi label end().

end

Dapatkan sentinel di akhir tampilan.

constexpr auto end()

Nilai hasil

Sentinel yang mengikuti elemen terakhir dalam tampilan:

Gambar vektor dengan elemen 10, 20, dan 30. Elemen pertama berisi 10 dan diberi label begin(). Elemen terakhir berisi 30 dan diberi label 'elemen terakhir'. Kotak imajiner setelah elemen terakhir menunjukkan sentinel dan diberi label end().

size

Dapatkan jumlah elemen dalam tampilan.

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

Parameter

Tidak ada.

Nilai hasil

Jumlah elemen dalam tampilan.

Lihat juga

<ranges>
filter adaptor rentang
lihat kelas