Lambdaudtryk: capture, mutable, generiske parametre
Skriv lambdaer med captures, mutable-semantik og generiske auto-parametre
Lambdaudtryk: capture, mutable, generiske parametre er en gratis C++ Academy-lektion på CoddyKit. Dette er lektion 3 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i C++ Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. C++ Academy-kurset indeholder 4 lektioner i alt.
Hvad er en lambdafunktion
En lambdafunktion er et anonymt funktionsobjekt, der er skrevet direkte i koden. Brug den, hvor du ellers ville skrive en lille navngiven funktion eller en struct med operator().
auto square = [](int x) { return x * x; };
std::cout << square(5); // 25Syntaksens dele
En lambdafunktion består af fire dele:
[capture]– hvilke variable fra det omgivende gyldighedsområde der skal bruges(parameters)– som en funktions parameterliste-> return_type– valgfri og ofte udledt{ body }
Tom capture
[] betyder "fang ingenting". Lambdaen tilgår kun globale og statiske variable.
auto add = [](int a, int b) { return a + b; };Capture efter værdi
Angiv variable i capture-klausulen for at kopiere dem ind i lambdaen.
int n = 5;
auto times = [n](int x) { return x * n; };
n = 10;
std::cout << times(3); // 15 (captured n was 5)Capture efter reference
Sæt & foran for at fange efter reference. Ændringer inde i lambdaen påvirker den ydre variabel.
int counter = 0;
auto inc = [&counter]() { ++counter; };
inc(); inc(); inc();
std::cout << counter; // 3Standard-captures: [=] og [&]
Fang alt, der bruges, efter værdi med [=] eller efter reference med [&]. Brug det med omtanke, og vær eksplicit, når du kan.
auto f = [=]() { return a + b; }; // copies a, b
auto g = [&]() { return a + b; }; // references a, bMutable lambdafunktioner
Som standard er variable, der fanges efter værdi, const inde i lambdaen. Tilføj mutable for at kunne ændre dem – ændringerne påvirker kun kopien i lambdaen.
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 scopeUdledning af returtypen
Kompileren udleder returtypen fra kroppen. Gør den eksplicit, når det er nødvendigt.
auto half = [](int x) -> double { return x / 2.0; };Generiske lambdafunktioner (C++14)
Brug auto i parameterlisten for at få en generisk lambdafunktion, der fungerer med enhver type.
auto print = [](const auto& x) { std::cout << x << "\n"; };
print(42); // int
print("hello"); // const char*
print(3.14); // doubleLambdaer som funktionsargumenter
STL-algoritmer accepterer lambdaer som prædikater og transformationer.
std::vector<int> v = {5, 2, 8, 1};
std::sort(v.begin(), v.end(), [](int a, int b) { return a > b; });Lambdaer er funktionsobjekter
Under motorhjelmen genererer kompileren en klasse med operator(). Du kan gemme lambdaer i std::function eller auto.
Hurtigt tjek
Kan du tildele en værdi til n inde i en lambda som [n](int x) { return x * n; } uden at gøre lambdaen mutable?
Opsummering
Lambdaer er anonyme funktionsobjekter, der er skrevet direkte i koden. Fang efter værdi eller reference, markér med mutable for at ændre værdifangede variable, og brug auto-parametre til generiske lambdaer i C++14 og nyere.
Lær C++ med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 51
- Lektioner
- 203
Ofte stillede spørgsmål
Er lektionen “Lambdaudtryk: capture, mutable, generiske parametre” gratis?
Ja — alle 3 lektioner i læringssporet C++ Academy, inklusive “Lambdaudtryk: capture, mutable, generiske parametre”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. C++ Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Lambdaudtryk: capture, mutable, generiske parametre”?
Skriv lambdaer med captures, mutable-semantik og generiske auto-parametre Du øver dig i C++ Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på C++ Academy?
Der kræves ingen tidligere erfaring. C++ Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 3 af 4.
Hvor lang tid tager lektionen “Lambdaudtryk: capture, mutable, generiske parametre”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne C++ Academy-lektion?
Ja. Alle C++ Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- auto, decltype og typeudledning
- Range-baseret for, nullptr og enum class
- Lambdaudtryk: capture, mutable, generiske parametre
- Strukturerede bindinger og if-init i C++17