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

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