Ontdek hoe lambdas uw code efficiënter en gemakkelijker te onderhouden kan maken.
Programmeertalen evolueren voortdurend, zelfs talen zoals C++ die zich lang geleden hebben gevestigd. Ze voegen functies toe aan standaardbibliotheken en brengen andere wijzigingen aan om het werk van programmeurs die in een dynamisch veld werken te vergemakkelijken.
Als onderdeel van de updates veroorzaakt door de evolutie van de taal, heeft C++ ondersteuning toegevoegd voor lambda-expressies in de release van 2011.
Wat is een lambda-expressie precies en hoe kun je deze als C++-programmeur in je voordeel gebruiken?
Wat is een Lambda-expressie?
Een lambda-expressie wordt ook wel een lambda-functie genoemd. Het is een inline-expressie met de mogelijkheid om argumenten te accepteren, bewerkingen uit te voeren en een waarde terug te geven, net als een typische functie.
U kunt een lambda in een andere functie gebruiken en deze aan een variabele toewijzen. Lamba-functies zijn een praktische manier om een anoniem functie-object in een programma te definiëren. Bijna elke taal ondersteunt lambdas, hoewel elke implementatie verschilt van de andere.
Wat zijn de onderdelen van een C++ Lambda-expressie?
Lambda-expressies zijn gemakkelijk te gebruiken in C++. U kunt de syntaxis van een lambda-expressie in C++ als volgt opsplitsen:
[capture_clause](parameters) opties { expression_body; }
Bijvoorbeeld:
int val = 13;
auto sumPlusVal = [waarde](int a, int b) veranderlijknee behalve ->int { opbrengst val + a + b; };
sumPlusVal(2, 5); // 20
Deze code verklaart de sumPlusVal variabele auto omdat een lambda-expressie elk gegevenstype kan accepteren en retourneren. Dit laat het aan de compiler over om het type tijdens het compileren te bepalen.
Uit de bovenstaande code kun je zien dat een lambda-expressie verschillende delen bevat die aangeven hoe deze werkt. Hier volgt een kort overzicht van elk van deze componenten.
-
Capture clausule: Dit is het eerste deel van een lambda-expressie waarin u reeds bestaande variabelen kunt specificeren of nieuwe kunt definiëren om in de hoofdtekst van de expressie te gebruiken. Er zijn verschillende manieren om opnamen te specificeren, bijvoorbeeld:
automatisch toevoegenTwo = [foo](){ opbrengst foo + 2; }; // op waarde
auto addThree = [&bar](){ opbrengst maat + 3; }; // op referentie
automatisch toevoegenAlleWaarde = [=](){ opbrengst foo + reep; }; // alles op waarde
automatisch toevoegenAlleRef = [&](){ opbrengst foo + reep; }; // alles op referentie// maak een variabele in de capture-clausule
auto createVarInCapture = [fooBar = foo + bar](){ opbrengst fooBar * 5; };// no capture - retourneert fout omdat foo niet toegankelijk is
auto errorExpression = [](){ opbrengst foo + 2; }; - Parameters: Dit deel van de lambda-expressie is ook optioneel. Het bevat de door de lambda vereiste functieparameters. Dit is niet anders dan de gebruikelijke manier waarop u functieparameters definieert in C++.
-
Opties: U kunt ook opties opgeven bij het definiëren van een lambda-expressie. Enkele opties die je zou kunnen gebruiken zijn: veranderlijk, uitzondering (bijv nee behalve in de eerste voorbeeldcode), ->retourtype (bijv ->int), vereist, attributen, enz. De veranderlijk optie wordt vaak gebruikt omdat het vangt aan te passen is binnen de lambda. Onderstaande code laat dit zien.
Hoewel de andere opties zelden worden gebruikt, kunt u er meer informatie over krijgen op de cppreference.com pagina over lambda's.int waarde = 10;
// retourneert een fout - waarde is een const binnen de expressie
automatisch verlagen = [waarde](){ opbrengst --waarde; };
auto increment = [waarde]() veranderlijk { opbrengst ++waarde; };
verhogen(); // 11 - Uitdrukkingslichaam: Dit is de body van de lambda-expressie die een waarde uitvoert en retourneert, net zoals een functie zou doen. Indien nodig kunt u de hoofdtekst van een lambda-expressie over meer dan één regel splitsen. Het is echter het beste om het zo kort mogelijk te houden om ongeorganiseerde code te voorkomen.
Wat zijn de voordelen van Lambda-expressies?
Er zijn veel voordelen aan het gebruik van lambda-functies in uw code. Afgezien van een hogere ontwikkelingssnelheid en efficiëntie, zijn de belangrijkste voordelen die u van lambda's krijgt als volgt:
- Lambda-expressies helpen de code schoon te houden. Een van de beste manieren om uw code eenvoudig en netjes te houden, is door waar mogelijk lambda's te gebruiken. Dit kan erg handig zijn bij het onderhouden van een leesbare en herbruikbare codestructuur.
-
U kunt lambda's doorgeven aan andere functies als parameters. De C++ standaard bibliothekenstandaard:: sort() methode maakt gebruik van dit voordeel. U kunt een lambda doorgeven als een van de parameters van deze methode om aan te geven hoe de functie de sortering moet uitvoeren. Bijvoorbeeld:
std:: vector<int> arr = {2, 5, 1, 3, 4};
std:: sorteren (arr.begin(), arr.end(), [](int a, int b){ opbrengst een // arr = {1, 2, 3, 4, 5} -
Lambda's zijn herbruikbaar. Soms wil je misschien een codeblok herbruikbaar maken in het kader van een functie in je programma zonder dat je een nieuwe functie hoeft te definiëren. Lambda's kunnen in dergelijke gevallen erg nuttig zijn. Beschouw het volgende voorbeeld van een herbruikbare lambda-expressie:
Dit programma geeft het volgende resultaat: Dit voorbeeld laat zien hoe eenvoudig het is om een lambda te definiëren, zodat u deze met elk type kunt gebruiken.#erbij betrekken <iostream>
gebruik makend van naamruimtesoa;inthoofd(){
// definieer een herbruikbare lambda
auto addUp = [](auto a, auto b, auto c) neebehalve {
cout <<"Nu optellen... "<< a <<", "<< b <<" en "<< c << endl;
opbrengst a + b + c ;
};cout << optellen (22, 33, 44) << endl;
cout << addUp (string("Gelukkig "), snaar("Geboorte"), snaar("dag")) << endl;
cout << optellen(WAAR, vals, WAAR) << std:: endl; // wordt uitgevoerd als getallen (1 en 0)
}
Lambda's gebruiken in C++
Er zijn veel andere voordelen die lambda-expressies bieden, en u zult ze ontdekken naarmate de structuur van uw programma complexer wordt. In feite verwijzen C++-programmeurs soms naar lambda-expressies als sluitingen omdat ze zo'n geweldige manier zijn om sluitingen in code te implementeren.
U moet lambda-expressies overwegen als u moderne C++-concepten in uw codebase wilt opnemen.