 |
Coders' city Nasza pasja to programowanie!
|
| Zobacz poprzedni temat :: Zobacz następny temat |
| Autor |
Wiadomość |
ram_techen
Dołączył: 05 Lut 2009 Posty: 288
|
Wysłany: Sro Lut 08, 2012 8:48 pm Temat postu: |
|
|
Lambda i Domknięcia ? Cóż to ? |
|
| Powrót do góry |
|
 |
|
|
marcin_an Site Admin
Dołączył: 26 Maj 2005 Posty: 17278 Skąd: z drugiej strony Kabla
|
Wysłany: Sro Lut 08, 2012 9:40 pm Temat postu: |
|
|
Wyrażeniami lambda nazywa się obecnie w programowaniu imperatywnym funkcje anonimowe. Funkcje takie są definiowane w dowolnym miejscu programu i wyrażenie je generujące zwraca funkcję, której potem można użyć.
Przykład poprzedni, zapisany z użyciem for_each. Kiedyś koniecznym byłoby zdefiniowanie oddzielnej funkcji do tego. W tej chwili można ją zdefiniować od razu w miejscu wywołania. | Kod: |   #include <algorithm>
  #include <iostream>
  #include <vector>
  #include <cstdlib>
  using namespace std;
  
  int main()
  {
  vector<int> data = {10, 20, 30, 40, 50, 60};
 
  for_each(data.begin(), data.end(), [](int v) {
  cout << v << '\n';
  });
 
  return EXIT_SUCCESS;
  }
  
|
W tym kodzie w liniach 11-13 jest zdefiniowana właśnie taka funkcja, która przyjmuje argument typu int i wyprowadza go na wyjście. Wyrażenie to w gruncie rzeczy "produkuje" nam funktor, który potem możemy wywoływać.
Jest to przykład trochę wymuszony. Bardziej realny to np. wywołanie funkcji find_if, w której trzeba podać predykat. Trzeba go najpierw zdefiniować, co ma trzy wady:- Zaśmieca kod, bo często takie rzeczy są wykorzystywane raz w całym programie.
- Utrudnia zrozumienie kodu, bo kod predykatu jest daleko od miejsca, gdzie jest używany.
- Niepotrzebnie zwiększa ilość kodu, bo trzeba napisać kupę "otoczki", która nic nie robi, a w niej umieścić często kilkuznakowe wyrażenie.
Możliwość zdefiniowania takiej funkcji od razu w miejscu wywołania nie powoduje takich problemów: | Kod: |   #include <algorithm>
  #include <iostream>
  #include <vector>
  #include <cstdlib>
  using namespace std;
  
  int main()
  {
  vector<int> data = {7, 5, 3, 120, 57, 60};
  auto firstOdd = find_if(data.begin(), data.end(), [](int v) {
  return v % 2 == 0;
  });
  
  if (firstOdd != data.end())
  {
  cout << "The first odd element is " << *firstOdd << '\n';
  }
  else
  {
  cout << "There are no odd elements!";
  }
 
  return EXIT_SUCCESS;
  }
  
|
Domknięcie to zbiór elementów środowiska, w którym funkcja została zdefiniowana. Nie są to - jak zwykle bywa - jej zmienne wewnętrzne czy argumenty, tylko właśnie to, co było dostępne, gdy była tworzona. Przykładowo wyobraźmy sobie, że nie szukamy liczby parzystej, tylko większej od pewnej liczby zadanej przez użytkownika: | Kod: |   #include <algorithm>
  #include <iostream>
  #include <vector>
  #include <cstdlib>
  using namespace std;
  
  int main()
  {
  vector<int> data = {7, 5, 3, 120, 57, 60};
  int x;
  vector<int>::const_iterator firstGreater;
 
  cin >> x;
 
  firstGreater = find_if(data.begin(), data.end(), [x](int v) {
  return v > x;
  });
  
  if (firstGreater != data.end())
  {
  cout << "The first number greater than " << x << " is "
  << *firstGreater << '\n';
  }
  else
  {
  cout << "There are no numbers greater than " << x << '\n';
  }
 
  return EXIT_SUCCESS;
  }
  
|
_________________ Matematyka to taki twór, który pozwala opisać sokowirówkę jako urządzenie pobierające ujemne odpadki i produkujące z nich sok. "Lameria atakuje" | RTFM | UMLet - edytor UML inaczej | Wykłady ks.Pawlukiewicza |
|
| Powrót do góry |
|
 |
biernik

Dołączył: 06 Wrz 2008 Posty: 1024 Skąd: 63°59'37''N 22°37'58''W
|
Wysłany: Sro Lut 08, 2012 9:49 pm Temat postu: |
|
|
To takie fajne mechanizmy ściągnięte(chyba) z języków funkcyjnych. Intuicyjnie rozumiem i stosuję z powodzeniem, ale ciężko mi to wytłumaczyć. Polecam chociażby wiki. Gdybym miał spróbować to wytłumaczyć to: lambda to takie wyrażenie które jest funkcją, bez deklaracji, definiowana w momencie użycia. closure to taka funkcja która, hmmm... może przechowywać stan, może być przechowywana w zmiennej... nie wiem jak to opisać :) taki funkcyjny odpowiednik objektu z OOP. Nie wiem, nie bijcie nie potrafię tego wytłumaczyć. Jeżeli wierzyć Albertowi to widocznie nie rozumiem tego wystarczająco dobrze :)
“If you can't explain it simply, you don't understand it well enough” _________________ I like cheese. |
|
| Powrót do góry |
|
 |
ram_techen
Dołączył: 05 Lut 2009 Posty: 288
|
Wysłany: Sro Lut 08, 2012 9:50 pm Temat postu: |
|
|
| Dzięki wielkie, świetny przykład. No cóż, pozostaje więc tylko czekać, aż ktoś napisze stosowną do nowego standardu(i do czytania) książkę. ;) |
|
| Powrót do góry |
|
 |
Taeril
Dołączył: 20 Cze 2005 Posty: 1163
|
Wysłany: Sro Lut 08, 2012 10:25 pm Temat postu: |
|
|
GoingNative 2012 dość ciekawe wystąpienia (przynajmniej te, które zdążyłem obejrzeć). Dodatkowo Herb Sutter w C++11, VC++11 and Beyond odpowiada na kilka pytań jakie miałem odnoście książek do C++11 więc nawet jest to w temacie pierwszego postu :) _________________ T.
"Some people, when confronted with a problem, think 'I know, I'll use regular expressions.' Now they have two problems." - Jamie Zawinski |
|
| Powrót do góry |
|
 |
|
|
Możesz pisać nowe tematy Możesz odpowiadać w tematach Nie możesz zmieniać swoich postów Nie możesz usuwać swoich postów Nie możesz głosować w ankietach Możesz dodawać załączniki na tym forum Możesz pobierać pliki z tego forum
|
 Debug: strone wygenerowano w 0.08223 sekund, zapytan = 7
|