Lambda-Ausdrücke
Content |
Ein Lambda-Ausdruck spezifiziert und erzeugt ein temporäres Funktionsobjekt. Der Ausdruck besteht aus drei Komponenten:
-
Zuerst kommt die in [...] eingefasste capture, die spezifiziert, welche lokal sichtbaren Variablen wie dem Lambda-Ausdruck zur Verfügung gestellt werden. Das geht
-
per Kopie,
-
per Referenz oder
-
per Initialisierung (ab C++14).
-
-
Dann folgt in Klammern die Parameterliste und ggf. weitere Spezifikationen zum Funktionsoperator und ggf. der Return-Typ. weitere Spezifikationen zum Funktionsoperator. Wenn der Return-Typ fehlt, wird implizit auto angenommen.
-
Schließlich folgt das in geschweifte Klammern gefasste compound statement.
Aus jedem Lambda-Ausdruck wird implizit eine Klasse erzeugt,
-
mit Variablen für alles, was durch die capture explizit oder implizit erfasst wird, wobei bei Referenzen entsprechend ein Referenztyp verwendet wird,
-
mit einem Konstruktor, der all die Variablen entsprechend der capture konstruiert und
-
einem als const deklarierten Funktions-Operator mit der angegebenen Parameterliste, Return-Typ und compound statement.
Aufgabe
Ersetzen Sie IsEven durch einen äquivalenten Lambda-Ausdruck.
Vorlage
#include <algorithm> #include <iomanip> #include <iostream> #include <numeric> #include <random> #include <vector> struct IsEven { bool operator()(const int& value) { return value % 2 == 0; } }; int main() { /* initialize values and fill it with shuffled values 1..100 */ std::vector<int> values(100); std::iota(values.begin(), values.end(), 1); std::shuffle(values.begin(), values.end(), std::mt19937(2)); /* select all even values out of it */ std::vector<int> selected_values; std::copy_if(values.begin(), values.end(), std::back_inserter(selected_values), IsEven()); /* print selected values */ int count = 0; for (auto value: selected_values) { std::cout << std::setw(4) << value; if (++count % 10 == 0) std::cout << std::endl; } }