User Tools

Site Tools


cpp:lamdas

This is an old revision of the document!


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 Expressions

Στο παρακάτω παράδειγμα οι βαθμοί ενός φοιτητής, φιλτράρονται ως προς την προσβασιμοτητας τους και από αυτούς υπολογίζεται άθροισμα και πλήθος, ώστε να εξαχθεί ο μέσος όρος.

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
    }
}

Παρατηρούμε ότι το Capture Clause λαμβάνει τις μεταβλητές sum, count, threshold. Οι δύο πρώτες καλούνται με αναφορά και την ενημερώνουην μετά την έξοδο από τη lamda, ενώ η threshold καλείται με τιμή.

cpp/lamdas.1779399202.txt.gz · Last modified: 2026/05/21 21:33 by gthanos