cpp:lamdas
This is an old revision of the document!
Table of Contents
Lamda Expressions
Στη C++, τα Lambda Expressions εισήχθησαν στο πρότυπο C++11 και αποτελούν έναν σύντομο τρόπο για τη δημιουργία ανώνυμων συναρτήσεων (function objects) απευθείας στο σημείο όπου χρειάζονται. Είναι ιδιαίτερα χρήσιμα όταν θέλουμε να δηλώσουμε μια σύντομη λογική, χωρίς να ορίζουμε επιπλέον συναρτήσεις ή κλάσεις.
Σύνταξη των lamda expressions
Μια λάμδα έκφραση αποτελείται από τέσσερα βασικά μέρη:
[capture clause] (parameters) → return_type { body }
- [Capture Clause]: Καθορίζει ποιες μεταβλητές από το εξωτερικό περιβάλλον είναι προσβάσιμες μέσα στη lamda.
- Parameters(): Οι παράμετροι της συνάρτησης, όπως σε μια κανονική συνάρτηση περικλύονται σε παρένθεση.
- Return Type (προαιρετικό): Επιστρεφόμενος τύπος. Συνήθως ο compiler το συμπεραίνει αυτόματα.
- {Body}: Ο κώδικας που εκτελείται στο σώμα της συνάρτησης. Περικλύεται σε άγκιστρα.
Capture Clause (Δέσμευση Μεταβλητών από το εξωτερικό περιβάλλον της lamda)
Το Capture Clause επιτρέπει στη lamda να “βλέπει” μεταβλητές που ορίστηκαν έξω από αυτήν, χωρίς οι μεταβλητές αυτές να είναι παράμετροι της. Διακρίνουμε τους παρακάτω τύπους Capture Clause.
| Capture | Περιγραφή |
|---|---|
| [ ] | Καμία εξωτερική μεταβλητή δεν είναι προσβάσιμη. |
| [x] | Δέσμευση της μεταβλητής x με τιμή (αντίγραφο). |
| [&x] | Δέσμευση της μεταβλητής x με αναφορά (reference). |
| [=] | Δέσμευση όλων των τοπικών μεταβλητών με τιμή. |
| [&] | Δέσμευση όλων των τοπικών μεταβλητών με αναφορά. |
Παραδείγματα Lamda
- filter_and_average.cpp
#include <iostream> #include <vector> #include <algorithm> int main() { std::vector<int> grades = {70, 85, 40, 92, 55, 30}; int sum = 0; int count = 0; int threshold = 50; // Δέσμευση με αναφορά (&) για να τροποποιούμε τα sum και count // Δέσμευση με τιμή (threshold) γιατί μόνο το διαβάζουμε std::for_each(grades.begin(), grades.end(), [&sum, &count, threshold](int g) { if (g >= threshold) { sum += g; count++; } }); if (count > 0) { std::cout << "Average of passing grades: " << (double)sum / count << std::endl; // Έξοδος: Average of passing grades: 75.5 } }
cpp/lamdas.1779398934.txt.gz · Last modified: 2026/05/21 21:28 by gthanos
