Implementering av en enkel generator
Bygg en generator-coroutine som gir verdier på en lat måte.
Implementering av en enkel generator er en gratis leksjon i C++ Academy på CoddyKit. Dette er leksjon 2 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i C++ Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i C++ Academy inneholder totalt 4 leksjoner.
Generatorer som coroutine-er
En generator er en coroutine som gir én verdi om gangen. Hvert kall til generatoren produserer den neste verdien og setter kjøringen på pause.
Generatortypen
Definer en klasse med en nestet promise_type. Kompilatoren bruker den til å håndtere tilstanden til coroutine-en.
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() ...
};Bruke generatoren
Når den er definert, føles generatorer som Python yield.
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
Kompilatoren returnerer en std::coroutine_handle. Den representerer den suspenderte coroutine-en — du kan kalle resume(), destroy() eller kontrollere done().
Pausepunkter
Hver co_yield setter kjøringen på pause. Når kalleren kaller resume(), fortsetter kjøringen til neste pausepunkt eller til coroutine-en avsluttes.
initial_suspend og final_suspend
To tilpasningspunkter:
initial_suspend— returnersuspend_alwaysfor en lat start, ellersuspend_neverfor en ivrig startfinal_suspend— styrer oppryddingen. Vanligvis brukessuspend_alwaysfor korrekt destruksjon
C++23 std::generator
C++23 la til std::generator i <generator>. Du trenger ikke lenger å implementere typen selv i vanlige tilfeller.
#include <generator>
std::generator<int> counting() {
int n = 0;
while (true) co_yield n++;
}Range-basert for
Hvis generatortypen støtter begin/end, fungerer range-basert for direkte.
for (int x : counting()) {
if (x >= 10) break;
std::cout << x;
}Pull- kontra push-semantikk
Generatorer er pull-baserte — kalleren styrer iterasjonen. Push-baserte coroutine-er er asynkrone oppgaver.
Bruksområder
Generatorer er godt egnet for:
- Late sekvenser (Fibonacci, primtall, fillesere linje for linje)
- Strømming av data uten materialisering
- Iterering gjennom trelignende strukturer
Minnehensyn
Coroutine-rammeverket allokeres som standard på heapen. Kompilatoren kan utelate allokeringen når inlining tillater det — mål ytelsen når den er viktig.
Biblioteker du kan utforske
For læring har cppcoro av Lewis Baker godt dokumenterte generator- og oppgavetyper. Boost.Asio tilbyr I/O som er tilpasset coroutine-er. Fra og med C++23 får du støtte i standardbiblioteket.
Rask kontroll
Hva heter standardbibliotekstypen for generator-coroutine-er i C++23?
Oppsummering
En generator-coroutine gir verdier lat ved hjelp av co_yield. Implementer den med en klasse som inneholder en promise_type. C++23 standardiserte std::generator. Generatorer egner seg svært godt for late sekvenser og strømming.
Lær deg C++ med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 51
- Leksjoner
- 203
Ofte stilte spørsmål
Er leksjonen «Implementering av en enkel generator» gratis?
Ja – du kan lese valgfritt 3 av leksjonene i læringsstien C++ Academy, inkludert «Implementering av en enkel generator», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i C++ Academy inneholder totalt 4 leksjoner.
Hva lærer jeg i «Implementering av en enkel generator»?
Bygg en generator-coroutine som gir verdier på en lat måte. Du øver på C++ Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med C++ Academy?
Ingen tidligere erfaring er nødvendig. C++ Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 2 av 4.
Hvor lang tid tar leksjonen «Implementering av en enkel generator»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne C++ Academy-leksjonen?
Ja. Alle C++ Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- Coroutine-konsepter: co_await, co_yield, co_return
- Implementering av en enkel generator
- Asynkrone oppgaver og awaiter-typer
- Allokering av coroutine-rammer