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:

  1. Definiujemy funkcję lambda, która porównuje długości stringów
  2. 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

Cheers!

Related Posts: