Mengimplementasikan Generator Sederhana
Bangun coroutine generator yang menghasilkan nilai secara malas
Mengimplementasikan Generator Sederhana adalah pelajaran C++ Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C++ Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C++ Academy mencakup 4 pelajaran total.
Generator sebagai Korutin
Generator adalah korutin yang menghasilkan nilai satu per satu. Setiap pemanggilan generator menghasilkan nilai berikutnya lalu ditangguhkan.
Tipe Generator
Definisikan kelas dengan promise_type bersarang. Kompiler menggunakannya untuk mengelola keadaan korutin.
template <typename T>
struct Generator {
struct promise_type {
T current_value;
Generator get_return_object() {
return Generator{std::coroutine_handle<promise_type>::from_promise(*this)};
}
std::suspend_always initial_suspend() { return {}; }
std::suspend_always final_suspend() noexcept { return {}; }
void return_void() {}
std::suspend_always yield_value(T value) {
current_value = value;
return {};
}
void unhandled_exception() { std::terminate(); }
};
std::coroutine_handle<promise_type> h;
// ... constructors, destructor, next() ...
};Menggunakan Generator
Setelah didefinisikan, generator terasa seperti yield Python.
Generator<int> counting() {
int n = 0;
while (true) co_yield n++;
}
auto g = counting();
for (int i = 0; i < 5; ++i) {
std::cout << g.next() << " ";
}
// 0 1 2 3 4coroutine_handle
Kompiler mengembalikan sebuah std::coroutine_handle. Objek ini merepresentasikan korutin yang ditangguhkan—Anda dapat memanggil resume(), destroy(), atau memeriksa done().
Titik Penangguhan
Setiap co_yield menangguhkan eksekusi. Saat pemanggil memanggil resume(), eksekusi berlanjut hingga penangguhan berikutnya atau akhir korutin.
initial_suspend dan final_suspend
Dua titik kustomisasi:
initial_suspend— kembalikansuspend_alwaysuntuk memulai secara malas;suspend_neveruntuk memulai secara langsungfinal_suspend— mengendalikan pembersihan. Biasanya gunakansuspend_alwaysagar penghancuran berlangsung dengan benar
C++23 std::generator
C++23 menambahkan std::generator dalam <generator>. Anda tidak perlu lagi membuat tipe tersebut sendiri untuk kasus umum.
#include <generator>
std::generator<int> counting() {
int n = 0;
while (true) co_yield n++;
}Perulangan for Berbasis Rentang
Jika tipe generator mendukung begin/end, perulangan berbasis rentang akan langsung berfungsi.
for (int x : counting()) {
if (x >= 10) break;
std::cout << x;
}Semantik Tarik vs Dorong
Generator bersifat berbasis tarik—pemanggil mengendalikan iterasi. Korutin berbasis dorong adalah tugas asinkron.
Kasus Penggunaan
Generator sangat baik untuk:
- Urutan malas (Fibonacci, bilangan prima, pembaca berkas baris demi baris)
- Pengaliran data tanpa materialisasi
- Iterasi struktur yang menyerupai pohon
Pertimbangan Memori
Bingkai korutin secara bawaan dialokasikan di heap. Kompiler dapat menghilangkan alokasi tersebut jika inlining memungkinkan—lakukan pengukuran saat kinerja menjadi hal penting.
Pustaka untuk Dipelajari
Untuk belajar, cppcoro karya Lewis Baker memiliki tipe generator dan tugas yang terdokumentasi dengan baik. Boost.Asio menyediakan I/O yang ramah terhadap korutin. Mulai C++23, pustaka standar menambahkan dukungan.
Pemeriksaan Singkat
Apa tipe pustaka standar C++23 untuk korutin generator?
Ringkasan
Korutin generator menghasilkan nilai secara malas dengan co_yield. Implementasikan dengan kelas yang berisi promise_type. C++23 menstandarkan std::generator. Generator sangat unggul untuk urutan malas dan pengaliran data.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Mengimplementasikan Generator Sederhana” gratis?
Ya — teks lengkap “Mengimplementasikan Generator Sederhana” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C++ Academy, upgrade ke CoddyKit PRO. Kursus C++ Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Mengimplementasikan Generator Sederhana”?
Bangun coroutine generator yang menghasilkan nilai secara malas Kamu berlatih C++ Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai C++ Academy?
Tidak diperlukan pengalaman sebelumnya. C++ Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.
Berapa lama pelajaran “Mengimplementasikan Generator Sederhana” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran C++ Academy ini?
Ya. Setiap pelajaran C++ Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Konsep Coroutine: co_await, co_yield, co_return
- Mengimplementasikan Generator Sederhana
- Tugas Asinkron dan Tipe Awaiter
- Alokasi Kerangka Coroutine