Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Meratakan Vektor yang Dikembalikan daripada Fungsi Menggunakan Talian Paip Julat-V3?
Pelipisan Paip Julat dengan Bekas Sementara Menggunakan Julat-V3
Masalah:
Anda mempunyai julat elemen (src) dan fungsi pihak ketiga (f) yang mengambil elemen julat sebagai input dan mengembalikan vektor. Anda ingin mengubah setiap elemen dalam julat menggunakan f dan meratakan vektor yang terhasil ke dalam julat tunggal. Walau bagaimanapun, menggunakan view::transform dan view::join secara langsung tidak akan berfungsi kerana paparan tidak boleh dibuat untuk bekas sementara.
Penyelesaian:
Untuk menyokong saluran paip tersebut , range-v3 memperkenalkan pengendali pandangan::cache1. Operator ini membenarkan anda menyimpan hasil paparan dalam bekas sementara dan kemudian mencipta paparan bekas itu. Dengan memasukkan paparan::cache1 dalam saluran paip, anda boleh membuat paparan vektor yang diratakan:
auto rng = src | views::transform(f) | views::cache1 | views::join;
Sampel Kod:
Sampel kod berikut menunjukkan cara untuk menggunakan paparan::cache1 untuk mencipta saluran paip julat yang mengubah dan meratakan elemen daripada julat:
<code class="cpp">#include <range/v3/view.hpp> #include <range/v3/algorithm.hpp> #include <vector> std::vector<std::string> f(int i) { return std::vector<std::string>(i, char('a' + i)); } int main() { auto rng = views::iota(0, 4) | views::transform([](int i) { return f(i); }) | views::cache1 | views::join('-'); check_equal(rng, {'-', 'b', '-', 'c', 'c', '-', 'd', 'd', 'd'}); CPP_assert(input_range<decltype(rng)>); CPP_assert(!range<const decltype(rng)>); CPP_assert(!forward_range<decltype(rng)>); CPP_assert(!common_range<decltype(rng)>); return 0; }</code>
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Meratakan Vektor yang Dikembalikan daripada Fungsi Menggunakan Talian Paip Julat-V3?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!