Krótko i konkretnie – o definiowaniu funkcji anonimowych (lambda expressions)
Szybki przykład
Wyobraźmy sobie, że potrzebujemy posortować listę stringów. Ale nie standardowo-słownikowo, tylko od najdłuższego do najkrótszego. Możemy to zrobić w dwóch krokach:
- Definiujemy funkcję lambda, która porównuje długości stringów
- Przekazujemy naszą funkcję do metody sortującej std::sort
w kodzie wygląda to tak:
// 1. auto isLongerThan = [](string a, string b)->bool{ return a.length() > b.length(); }; // 2. std::sort(strings.begin(), strings.end(), isLongerThan);
Na pierwszy rzut oka lambda wygląda trochę zawile, ale zaraz wszystko stanie się jasne :)
Składnia
Ogólnie, składnia funkcji lambda jest następująca:
auto isLongerThan = // definiujemy zmienną przechowującą naszą funkcję [] // mówimy, że teraz zostanie zdefiniowana lambda (string a, string b) // określamy parametry wejściowe ->bool // określamy typ zwracany funkcji { return a.length() > b.length(); }; // ciało funkcji
, przy czym z reguły deklarację zwracanego typu (->bool) można pominąć – kompilator sam wywnioskuje, jaki typ funkcja zwraca.
Wypróbujmy
Teraz posortujemy sobie stringi po długości. Niech to będą nazwy wysp, tak… wakacyjnie :) :
#include <iostream> #include <algorithm> #include <vector> #include <string> using namespace std; int main() { // nasze wyspy vector<string> islands = {"Nowa Zelandia", "Kuba", "Gran Canaria", "Islandia", "Malta"}; // nasza lambda porównująca długosci stringów. // nie określamy wprost zwracanego typu - kompilator sam się domyśli auto isLongerThan = [](string a, string b) { return a.length() > b.length(); }; // sortujemy po długości sort(islands.begin(), islands.end(), isLongerThan); // wyświetlamy posortowane wyspy for (string &s : islands) cout << s << endl; return 0; }
, w wyniku czego dostajemy pięknie posortowane:
Nowa Zelandia Gran Canaria Islandia Malta Kuba