C++ Academy · Pelajaran

Ungkapan Lambda: Capture, Mutable, Generik

Tulis lambda dengan capture, semantik mutable dan parameter auto generik.

Pelajaran 3 daripada 413 langkah

Ungkapan Lambda: Capture, Mutable, Generik ialah pelajaran C++ Academy percuma di CoddyKit. Ini ialah pelajaran 3 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran C++ Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus C++ Academy merangkumi sejumlah 4 pelajaran.

Apakah Lambda?

Lambda ialah objek fungsi tanpa nama yang ditulis sebaris. Gunakannya apabila anda biasanya akan menulis fungsi kecil bernama atau struct dengan operator().

auto square = [](int x) { return x * x; };
std::cout << square(5);   // 25

Anatomi Sintaks

Lambda mempunyai empat bahagian:

  • [capture] — pemboleh ubah daripada ruang lingkup sekeliling yang hendak digunakan
  • (parameters) — seperti senarai parameter fungsi
  • -> return_type — pilihan, dan sering dideduksi
  • { body }

Penangkapan Kosong

[] bermaksud "jangan tangkap apa-apa." Lambda hanya mengakses global dan statik.

auto add = [](int a, int b) { return a + b; };

Penangkapan Mengikut Nilai

Senaraikan pemboleh ubah dalam klausa penangkapan untuk menyalinnya ke dalam lambda.

int n = 5;
auto times = [n](int x) { return x * n; };
n = 10;
std::cout << times(3);   // 15 (captured n was 5)

Penangkapan Mengikut Rujukan

Letakkan awalan & untuk membuat penangkapan mengikut rujukan. Perubahan di dalam lambda akan mempengaruhi pemboleh ubah luar.

int counter = 0;
auto inc = [&counter]() { ++counter; };
inc(); inc(); inc();
std::cout << counter;   // 3

Penangkapan Lalai: [=] dan [&]

Tangkap semua yang digunakan mengikut nilai dengan [=], atau semuanya mengikut rujukan dengan [&]. Gunakan dengan berhati-hati — nyatakan secara jelas apabila boleh.

auto f = [=]() { return a + b; };   // copies a, b
auto g = [&]() { return a + b; };   // references a, b

Lambda Boleh Diubah

Secara lalai, penangkapan mengikut nilai ialah const di dalam lambda. Tambahkan mutable untuk membolehkannya diubah — perubahan itu hanya mempengaruhi salinan lambda.

int n = 5;
auto f = [n]() mutable {
    n += 1;       // OK because of mutable
    return n;
};
f(); f();        // returns 6, then 7
std::cout << n;  // still 5 in outer scope

Deduksi Jenis Pulangan

Penyusun membuat deduksi jenis pulangan daripada badan fungsi. Jadikannya jelas apabila diperlukan.

auto half = [](int x) -> double { return x / 2.0; };

Lambda Generik (C++14)

Gunakan auto dalam senarai parameter untuk mendapatkan lambda generik yang berfungsi dengan apa-apa jenis.

auto print = [](const auto& x) { std::cout << x << "\n"; };
print(42);          // int
print("hello");    // const char*
print(3.14);       // double

Lambda sebagai Argumen Fungsi

Algoritma STL menerima lambda sebagai predikat dan transformasi.

std::vector<int> v = {5, 2, 8, 1};
std::sort(v.begin(), v.end(), [](int a, int b) { return a > b; });

Lambda ialah Objek Fungsi

Di sebalik tabir, penyusun menjana class dengan operator(). Anda boleh menyimpan lambda dalam std::function atau auto.

Semakan Pantas

Di dalam lambda [n](int x) { return x * n; }, bolehkah anda menetapkan nilai kepada n tanpa menjadikan lambda itu mutable?

Imbas Kembali

Lambda ialah objek fungsi tanpa nama yang ditulis sebaris. Buat penangkapan mengikut nilai atau rujukan, tandakan dengan mutable untuk mengubah penangkapan nilai, dan gunakan parameter auto untuk lambda generik dalam C++14 dan versi lebih baharu.

Percuma untuk bermula

Pelajari C++ dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
51
Pelajaran
203

Soalan Lazim

Adakah pelajaran “Ungkapan Lambda: Capture, Mutable, Generik” percuma?

Ya — sebanyak 3 pelajaran dalam laluan pembelajaran C++ Academy, termasuk “Ungkapan Lambda: Capture, Mutable, Generik”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus C++ Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Ungkapan Lambda: Capture, Mutable, Generik”?

Tulis lambda dengan capture, semantik mutable dan parameter auto generik. Anda berlatih C++ Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan C++ Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran C++ Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 3 daripada 4.

Berapa lamakah pelajaran “Ungkapan Lambda: Capture, Mutable, Generik” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran C++ Academy ini?

Ya. Setiap pelajaran C++ Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. auto, decltype dan Deduksi Jenis
  2. for Berasaskan Julat, nullptr dan enum class
  3. Ungkapan Lambda: Capture, Mutable, Generik
  4. Binding Berstruktur dan if-init C++17
← Kembali ke C++ Academy