Forum Coders' city Strona Główna Coders' city
Nasza pasja to programowanie!
 

 PomocPomoc   SzukajSzukaj   UżytkownicyUżytkownicy   GrupyGrupy  RejestracjaRejestracja 
Archiwum starego forum + teoria    RSS & Panel/SideBar
 ProfilProfil   Zaloguj się, by sprawdzić wiadomościZaloguj się, by sprawdzić wiadomości   ZalogujZaloguj 

Potrzebuję szybkiej odpowiedzi na moje pytanie... Skrócony regulamin

[C++] Książki do C++11

Idź do strony Poprzedni  1, 2, 3

 
Odpowiedz do tematu    Forum Coders' city Strona Główna -> C i C++
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
ram_techen



Dołączył: 05 Lut 2009
Posty: 288

PostWysłany: Sro Lut 08, 2012 8:48 pm      Temat postu: Odpowiedz z cytatem Pisownia

Lambda i Domknięcia ?
Cóż to ?
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Wyślij email Numer GG WP Kontakt
marcin_an
Site Admin


Dołączył: 26 Maj 2005
Posty: 17278
Skąd: z drugiej strony Kabla

PostWysłany: Sro Lut 08, 2012 9:40 pm      Temat postu: Odpowiedz z cytatem Pisownia

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:
  1. Zaśmieca kod, bo często takie rzeczy są wykorzystywane raz w całym programie.
  2. Utrudnia zrozumienie kodu, bo kod predykatu jest daleko od miejsca, gdzie jest używany.
  3. 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
Zobacz profil autora Wyślij prywatną wiadomość
biernik



Dołączył: 06 Wrz 2008
Posty: 1024
Skąd: 63°59'37''N 22°37'58''W

PostWysłany: Sro Lut 08, 2012 9:49 pm      Temat postu: Odpowiedz z cytatem Pisownia

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
Zobacz profil autora Wyślij prywatną wiadomość
ram_techen



Dołączył: 05 Lut 2009
Posty: 288

PostWysłany: Sro Lut 08, 2012 9:50 pm      Temat postu: Odpowiedz z cytatem Pisownia

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
Zobacz profil autora Wyślij prywatną wiadomość Wyślij email Numer GG WP Kontakt
Taeril



Dołączył: 20 Cze 2005
Posty: 1163

PostWysłany: Sro Lut 08, 2012 10:25 pm      Temat postu: Odpowiedz z cytatem Pisownia

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
Zobacz profil autora Wyślij prywatną wiadomość
Wyświetl posty z ostatnich:   
Odpowiedz do tematu    Forum Coders' city Strona Główna -> C i C++ Wszystkie czasy w strefie CET (Europa)
Idź do strony Poprzedni  1, 2, 3
Strona 3 z 3

 
Skocz do:  
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
contact

| Darmowe programy i porady Jelcyna | VB4all | Tansze zakupy w Helionie |