Μάθετε πώς τα λάμδα μπορούν να κάνουν τον κώδικά σας πιο αποτελεσματικό και ευκολότερο στη συντήρηση.
Οι γλώσσες προγραμματισμού εξελίσσονται συνεχώς, ακόμη και εκείνες όπως η C++ που καθιερώθηκαν εδώ και πολύ καιρό. Προσθέτουν λειτουργίες σε τυπικές βιβλιοθήκες και κάνουν άλλες αλλαγές για να διευκολύνουν τη δουλειά των προγραμματιστών που εργάζονται σε ένα δυναμικό πεδίο.
Ως μέρος των ενημερώσεων που επέφερε η εξέλιξη της γλώσσας, η C++ πρόσθεσε υποστήριξη για εκφράσεις λάμδα στην κυκλοφορία του 2011.
Τι ακριβώς είναι μια έκφραση λάμδα και πώς μπορείτε να τη χρησιμοποιήσετε προς όφελός σας ως προγραμματιστής C++;
Τι είναι μια έκφραση λάμδα;
Μια έκφραση λάμδα είναι επίσης γνωστή ως συνάρτηση λάμδα. Είναι μια ενσωματωμένη έκφραση με δυνατότητα αποδοχής ορισμάτων, εκτέλεσης πράξεων και επιστροφής μιας τιμής, όπως ακριβώς μια τυπική λειτουργία.
Μπορείτε να χρησιμοποιήσετε ένα λάμδα μέσα σε μια άλλη συνάρτηση και να το αντιστοιχίσετε σε μια μεταβλητή. Οι συναρτήσεις Lamba είναι ένας πρακτικός τρόπος ορισμού ενός αντικειμένου ανώνυμης συνάρτησης σε ένα πρόγραμμα. Σχεδόν κάθε γλώσσα υποστηρίζει λάμδα, αν και κάθε υλοποίηση διαφέρει από τις άλλες.
Ποια είναι τα μέρη μιας έκφρασης λάμδα C++;
Οι εκφράσεις λάμδα είναι εύκολες στη χρήση στη C++. Μπορείτε να αναλύσετε τη σύνταξη μιας έκφρασης λάμδα στη C++ ως εξής:
[capture_clause](parameters) options { expression_body; }
Για παράδειγμα:
ενθ val = 13;
αυτο sumPlusVal = [val](ενθ ένα, ενθ σι) ευμετάβλητοςόχι εκτός ->ενθ { ΕΠΙΣΤΡΟΦΗ val + a + b; };
sumPlusVal(2, 5); // 20
Αυτός ο κωδικός δηλώνει το sumPlusVal μεταβλητή auto επειδή μια έκφραση λάμδα μπορεί να δεχθεί και να επιστρέψει οποιονδήποτε τύπο δεδομένων. Αυτό αφήνει στον μεταγλωττιστή να καθορίσει τον τύπο κατά τη μεταγλώττιση.
Από τον παραπάνω κώδικα, μπορείτε να δείτε ότι μια έκφραση λάμδα περιέχει πολλά μέρη που καθορίζουν τον τρόπο λειτουργίας της. Ακολουθεί μια γρήγορη επισκόπηση καθενός από αυτά τα στοιχεία.
-
Ρήτρα σύλληψης: Αυτό είναι το πρώτο μέρος μιας έκφρασης λάμδα όπου μπορείτε να καθορίσετε προϋπάρχουσες μεταβλητές ή να ορίσετε νέες για χρήση στο σώμα της έκφρασης. Υπάρχουν διάφοροι τρόποι καθορισμού συλλήψεων, για παράδειγμα:
auto addTwo = [foo](){ ΕΠΙΣΤΡΟΦΗ foo + 2; }; // κατά τιμή
auto addThree = [&bar](){ ΕΠΙΣΤΡΟΦΗ μπαρ + 3; }; // με αναφορά
auto addAllVal = [=](){ ΕΠΙΣΤΡΟΦΗ foo + μπαρ? }; // όλα κατά τιμή
auto addAllRef = [&](){ ΕΠΙΣΤΡΟΦΗ foo + μπαρ? }; // όλα με αναφορά// δημιουργήστε μια μεταβλητή στον όρο σύλληψης
auto createVarInCapture = [fooBar = foo + bar](){ ΕΠΙΣΤΡΟΦΗ fooBar * 5; };// no capture - επιστρέφει σφάλμα επειδή το foo δεν είναι προσβάσιμο
Auto errorExpression = [](){ ΕΠΙΣΤΡΟΦΗ foo + 2; }; - Παράμετροι: Αυτό το τμήμα της έκφρασης λάμδα είναι επίσης προαιρετικό. Περιέχει τις παραμέτρους λειτουργίας που απαιτούνται από το λάμδα. Αυτό δεν διαφέρει από τον συνηθισμένο τρόπο με τον οποίο ορίζετε τις παραμέτρους συνάρτησης στη C++.
-
Επιλογές: Μπορείτε επίσης να καθορίσετε επιλογές κατά τον ορισμό μιας έκφρασης λάμδα. Μερικές επιλογές που μπορείτε να χρησιμοποιήσετε είναι: ευμετάβλητος, εξαίρεση (π.χ όχι εκτός στο πρώτο δείγμα κώδικα), ->return_type (π.χ -> ενθ), απαιτεί, γνωρίσματα, και τα λοιπά. ο ευμετάβλητος Η επιλογή χρησιμοποιείται συχνά επειδή επιτρέπει στις συλλήψεις να μπορούν να τροποποιηθούν μέσα στο λάμδα. Ο παρακάτω κώδικας το δείχνει αυτό.
Αν και οι άλλες επιλογές χρησιμοποιούνται σπάνια, μπορείτε να λάβετε περισσότερες πληροφορίες σχετικά με αυτές στο cppreference.com σελίδα στο λάμδα.ενθ αξία = 10;
// επιστρέφει ένα σφάλμα - η τιμή είναι ένα const μέσα στην παράσταση
αυτόματη μείωση = [τιμή](){ ΕΠΙΣΤΡΟΦΗ --αξία; };
auto increment = [value]() mutable { ΕΠΙΣΤΡΟΦΗ ++τιμή; };
αύξηση(); // 11 - Σώμα έκφρασης: Αυτό είναι το σώμα της έκφρασης λάμδα που εκτελεί και επιστρέφει μια τιμή, όπως θα έκανε μια συνάρτηση. Εάν είναι απαραίτητο, μπορείτε να χωρίσετε το σώμα μιας έκφρασης λάμδα σε περισσότερες από μία γραμμές. Ωστόσο, είναι βέλτιστη πρακτική να είναι όσο το δυνατόν πιο σύντομη για να αποφευχθεί ο αποδιοργανωμένος κώδικας.
Ποια είναι τα οφέλη των εκφράσεων λάμδα;
Υπάρχουν πολλά πλεονεκτήματα από τη χρήση συναρτήσεων λάμδα στον κώδικά σας. Εκτός από την αυξημένη ταχύτητα ανάπτυξης και αποτελεσματικότητα, τα κορυφαία οφέλη που λαμβάνετε από τα λάμδα είναι τα εξής:
- Οι εκφράσεις λάμδα βοηθούν να διατηρείται ο κώδικας καθαρός. Ένας από τους καλύτερους τρόπους για να διατηρήσετε τον κώδικά σας απλό και τακτοποιημένο είναι να χρησιμοποιείτε λάμδα όπου είναι δυνατόν. Αυτό μπορεί να είναι πολύ χρήσιμο για τη διατήρηση μιας ευανάγνωστης και επαναχρησιμοποιήσιμης δομής κώδικα.
-
Μπορείτε να μεταβιβάσετε λάμδα σε άλλες συναρτήσεις ως παραμέτρους. ο Πρότυπη βιβλιοθήκη C++std:: sort() η μέθοδος χρησιμοποιεί αυτό το όφελος. Μπορείτε να περάσετε ένα λάμδα ως μία από τις παραμέτρους αυτής της μεθόδου για να καθορίσετε τον τρόπο με τον οποίο η συνάρτηση πρέπει να πραγματοποιεί την ταξινόμηση. Για παράδειγμα:
std:: διάνυσμα<ενθ> arr = {2, 5, 1, 3, 4};
std:: ταξινόμηση (arr.begin(), arr.end(), [](ενθ ένα, ενθ σι){ ΕΠΙΣΤΡΟΦΗ a < b; });
// arr = {1, 2, 3, 4, 5} -
Τα λάμδα είναι επαναχρησιμοποιήσιμα. Μερικές φορές, μπορεί να θέλετε να κάνετε ένα μπλοκ κώδικα επαναχρησιμοποιήσιμο στο εύρος μιας συνάρτησης στο πρόγραμμά σας χωρίς να χρειάζεται να ορίσετε μια νέα συνάρτηση. Το λάμδα μπορεί να είναι πολύ χρήσιμο σε τέτοιες περιπτώσεις. Εξετάστε το ακόλουθο παράδειγμα μιας επαναχρησιμοποιήσιμης έκφρασης λάμδα:
Αυτό το πρόγραμμα παράγει το ακόλουθο αποτέλεσμα: Αυτό το παράδειγμα δείχνει πόσο απλό είναι να ορίσετε ένα λάμδα ώστε να μπορείτε να το χρησιμοποιήσετε με οποιονδήποτε τύπο.#περιλαμβάνω <iostream>
χρησιμοποιώντας χώρο ονομάτωνstd;ενθκύριος(){
// ορίστε ένα επαναχρησιμοποιήσιμο λάμδα
auto addUp = [](auto a, auto b, auto c) noexcept {
cout <<"Τώρα προσθέτουμε... "<< ένα <<", "<< σι <<" και "<< ντο << endl;
ΕΠΙΣΤΡΟΦΗ a + b + c ;
};cout << addUp (22, 33, 44) << endl;
cout << addUp (string("Χαρούμενος "), συμβολοσειρά ("Γέννηση"), συμβολοσειρά ("ημέρα")) << endl;
cout << addUp(αληθής, ψευδής, αληθής) << std:: endl; // εκτελείται ως αριθμοί (1 και 0)
}
Χρήση του Lambdas σε C++
Υπάρχουν πολλά άλλα οφέλη που προσφέρουν οι εκφράσεις λάμδα και θα τα ανακαλύψετε καθώς η δομή του προγράμματός σας γίνεται πιο περίπλοκη. Στην πραγματικότητα, οι προγραμματιστές C++ αναφέρονται μερικές φορές στις εκφράσεις λάμδα ως κλεισίματα, επειδή είναι ένας πολύ καλός τρόπος για την υλοποίηση κλεισίματος σε κώδικα.
Θα πρέπει να λάβετε υπόψη τις εκφράσεις λάμδα εάν θέλετε να ενσωματώσετε σύγχρονες έννοιες C++ στη βάση κώδικα σας.