kennen:lambda
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
— | kennen:lambda [2020-07-27 09:52] (aktuell) – angelegt - Externe Bearbeitung 127.0.0.1 | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | ====== Lambda-Ausdrücke ====== | ||
+ | |||
+ | > // Aus diesem Grunde kratzen die folgenden Beispiele nur an der Oberfläche. // | ||
+ | > // Andererseits können wir nur an der Oberfläche kratzen, denn wenn wir tiefer kratzen, sind wir nicht mehr an der Oberfläche. // | ||
+ | >> | ||
+ | |||
+ | ===== Ad-hoc-Funktionen ===== | ||
+ | [[..: | ||
+ | [[..: | ||
+ | erwarten oft eine Funktion oder einen Funktor, der auf Elemente eines Bereichs angewendet wird. | ||
+ | Mit einem Lambda-Ausdruck kann diese Funktion an Ort und Stelle erzeugt werden: | ||
+ | <code cpp> | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | void lambdademo() | ||
+ | { | ||
+ | std::string s = " | ||
+ | |||
+ | std:: | ||
+ | [] (char c) { std::cout << c; } // <-- hier | ||
+ | ); | ||
+ | std::cout << std::endl; | ||
+ | } | ||
+ | </ | ||
+ | Lambdas sind anonyme, lokal definierte Funktionen. | ||
+ | Der Rückgabetyp wird, sofern möglich, automatisch ermittelt. | ||
+ | Er kann hinter der Parameterliste mit '' | ||
+ | <code cpp> | ||
+ | std::string uppercase; | ||
+ | std:: | ||
+ | std:: | ||
+ | [] (char c) -> bool | ||
+ | { | ||
+ | return (' | ||
+ | } | ||
+ | ); | ||
+ | std::cout << uppercase << std::endl; | ||
+ | </ | ||
+ | Man beachte den neuen Algorithmus '' | ||
+ | |||
+ | Lambdas sind als Variablenwerte speicherbar, | ||
+ | Das Schlüsselwort [[kennen: | ||
+ | <code cpp> | ||
+ | auto fromAtoZ = [] (char c) -> char | ||
+ | { | ||
+ | return (' | ||
+ | }; | ||
+ | |||
+ | std:: | ||
+ | std:: | ||
+ | |||
+ | </ | ||
+ | |||
+ | ===== Closure ===== | ||
+ | Lambda-Ausdrücke beginnen mit einer eckigen Klammer. | ||
+ | In dieser kann angegeben werden, welche lokalen Variablen(werte) | ||
+ | der Umgebung innerhalb des Lambda-Ausdrucks bekannt sein sollen. | ||
+ | Dieses Einbeziehen der Umgebung wird Closure (Einschluss) genannt. | ||
+ | <code cpp> | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | void closuredemo() | ||
+ | { | ||
+ | std::string s = " | ||
+ | char low = ' | ||
+ | |||
+ | std:: | ||
+ | [low, high] (char c) // closure by value | ||
+ | { | ||
+ | if (low <= c && c <= high) std::cout << c; | ||
+ | } | ||
+ | ); | ||
+ | std::cout << std::endl; | ||
+ | } | ||
+ | </ | ||
+ | Hier werden die bei der Lambda-Definition aktuellen Werte der Variablen '' | ||
+ | Auch referenzieller Einschluss ist möglich und manchmal erwünscht: | ||
+ | <code cpp> | ||
+ | int count = 0; | ||
+ | std:: | ||
+ | [low, high, &count] (char c) // closure by reference: & | ||
+ | { | ||
+ | if (low <= c && c <= high) ++count; | ||
+ | } | ||
+ | ); | ||
+ | std::cout << count << std::endl; | ||
+ | </ | ||
+ | Durch die Angabe '' | ||
+ | Durch '' | ||
+ | Auch gemischte Angaben '' | ||
+ | In Methoden definierte Lambdas können '' | ||
+ | um an Attribute eines Objektes heranzukommen. | ||
+ | Weitere Beispiele sind im | ||
+ | [[http:// | ||
+ | zu finden. | ||
+ | |||
+ | ===== Lambda-capture-Ausdrücke ===== | ||
+ | C++14 erlaubt bei der Definition des Lambda-Ausdrucks neue lokale Variablen einzuführen, | ||
+ | <code cpp> | ||
+ | void tabulate(double a, double b, int n) | ||
+ | { | ||
+ | auto f = [a, dy = (b-a)/n] (int i) { return a + i * dy; }; | ||
+ | |||
+ | for (int i = 0; i <= n; ++i) | ||
+ | { | ||
+ | std::cout << i << ' | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | ===== Generische Lambda-Ausdrücke ===== | ||
+ | Der Typ von Lambda-Parametern kann vom Compiler ermittelt werden (ab [[kennen: | ||
+ | |||
+ | <code cpp> | ||
+ | void generic_demo() | ||
+ | { | ||
+ | std:: | ||
+ | |||
+ | std:: | ||
+ | |||
+ | for (auto e : v) std::cout << e << ' '; | ||
+ | std::cout << ' | ||
+ | } | ||
+ | </ | ||