Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.
Nástěnka
❗22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
❗04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
❗23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.
Nejste přihlášen(a). Přihlásit
No a víš co je normální funkce, případně pointer na funkci a předávání funkce jako parametr?
Tak lamda-funkce je trik jak to udělat, abys mohl napsat přímo kód do místa, kde potřebuješ funkci předat jako parametr a nemusel jsi ji definovat extra.
Offline
Dobrý deň ↑ MichalAld:,
mám takýto príklad:
auto f = [parametre1] (parametre2) {parametre3}
Mohol by si mi definovať, čo sú to: parametre1, parametre2 a parametre3?
Ďakujem.
Offline
Co je v hranatých závorkách pro začátek neřeš, to je trochu advanced. Zatím je nech prázdné. V kulatých jsou parametry, stejně jako u normální funkce, např (int a, float b) a ve složených je tělo funkce, jako u normální funkce, třeba {return b + (float) a}
Tady je celkem hezký popis, klidně se ptej dál, když nebudeš něčemu rozumět:
Odkaz
Offline
Dobrý deň ↑ MichalAld:,
// captures_lambda_expression.cpp // compile with: /W4 /EHsc #include <iostream> using namespace std; int main() { int m = 0; int n = 0; [&, n] (int a) mutable { m = ++n + a; }(4); cout << m << endl << n << endl; }
Edit:
Už som to pochopil: [&, n] je to isté ako [n], čiže jedná sa o volanie hodnotou a [=, &m] je to isté ako [&m], čiže jedná sa o volanie odkazom.
Ešte sa chcem opýtať: ak v hranatých zátvorkách nie je určené m, tak sa volá odkazom? Z príkladu to tak vyznieva.
Offline
fmfiain napsal(a):
Už som to pochopil: [&, n] je to isté ako [n], čiže jedná sa o volanie hodnotou a [=, &m] je to isté ako [&m], čiže jedná sa o volanie odkazom.
Ešte sa chcem opýtať: ak v hranatých zátvorkách nie je určené m, tak sa volá odkazom? Z príkladu to tak vyznieva.
Jestli tomu rozumím správně, tak když je tam [=] tak se všechno volá hodnotou, když je tam [=, &m, &p] tak se všechno volá hodnotou, jen vyjmenované proměnné m, p se volají odkazem.
No a naopak, [&] znamená, že se všechno volá odkazem, a případně lze vybrat proměnné které se volají hodnotou.
Offline
Hele, celkově ty lambda-funkce nejsou nic, bez čeho by se nedalo žít, vždycky se dá napsat i normální funkce (až teda na ten přístup k okolním proměnným, to normální funkce neumějí, i když nevím, jestli to v dnešním C++ taky nějak nejde.
Jak to chápu já, tak jejich použití dává smysl hlavně, když:
1) Potřebuješ svoji funkci dát jako parametr nějaké (zpravidla externí) funkci - jak to bylo u toho příkladu s tříděním.
2) a zároveň je ta funkce jednoduchá, a nikde jinde v programu ji nepotřebuješ.
Zrovna to třídění není podle mě úplně ideální případ, protože funkci na porovníní objektů, které chceš třídit, máš zpravidla napsanou.
Ale když chceš třeba vybírat z nějakého seznamu (listu) objektů - tak funkce co představují tu výběrovou podmínku. Takových podmínek můžeš mít kupu, a k ničemu jinému ji nepotřebuješ, jen k tomu, aby sis vybral potřebné objekty.
Taky dobrý přístup je, že když je vymýšlení názvu funkce větší problém než napsat její kód. Protože lambda-funkce je prostě "funkce bez názvu".
Celkově je to k tomu, aby byl kód maximálně přehledný a expresivní - tedy aby v té chvíli, kdy funkci předáváš jako parametr bylo hned vidět, co ta funkce vlastně dělá.
Já to sám moc nepoužívám, takže je možné, že některé věci neříkám úplně správně.
Offline
Dobrý deň ↑ MichalAld:,
ja som len zistil, že [=, &m] je volanie odkazom. Na ostatné sa budem musieť pozrieť. A [&, m] je volanie hodnotou.
Offline
Dobrý deň ↑ MichalAld:,
ak zmením lambda funkciu (1):
// captures_lambda_expression.cpp // compile with: /W4 /EHsc #include <iostream> using namespace std; int main() { int m = 0; int n = 0; [&, n] (int a) mutable { m = ++n + a; }(4); cout << m << endl << n << endl; }
Vráti mi to:
5
0
Čo znamená, že m sa volá referenciou a n hodnotou.
Ak zmením lambda funkciu (2):
// captures_lambda_expression.cpp // compile with: /W4 /EHsc #include <iostream> using namespace std; int main() { int m = 0; int n = 0; [=, &n] (int a) mutable { m = ++n + a; }(4); cout << m << endl << n << endl; }
Vráti mi to:
0
1
Čo znamená, že m sa volá hodnotou a n referenciou.
Ak zmením lambda funkciu (3):
// captures_lambda_expression.cpp // compile with: /W4 /EHsc #include <iostream> using namespace std; int main() { int m = 0; int n = 0; [&, m] (int a) mutable { m = ++n + a; }(4); cout << m << endl << n << endl; }
Vráti mi to:
0
1
Čo znamená, že m sa volá hodnotou a n referenciou.
Ak zmením lambda funkciu (4):
// captures_lambda_expression.cpp // compile with: /W4 /EHsc #include <iostream> using namespace std; int main() { int m = 0; int n = 0; [=, &m] (int a) mutable { m = ++n + a; }(4); cout << m << endl << n << endl; }
Vráti mi to:
5
0
Čo znamená, že m sa volá referenciou a n hodnotou.
Sumár:
(1) [&, n] je volanie hodnotou na n a ostatné sú referencie.
(2) [=, &n] je volanie referenciou na n a ostatné sú volania hodnotou.
(3) [&, m] je volanie hodnotou na m a ostatné sú referencie.
(4) [=, &m] je volanie referenciou na m a ostatné volania sú hodnotou.
Offline
↑ fmfiain:
A "lambda" function in C++ is an anonymous function that you can define directly in your code without needing to give it a name. It allows you to define small, inline functions that are useful for short tasks, often passed as arguments to other functions. You can also capture variables from the surrounding scope inside the lambda by specifying them in square brackets []. Lambdas are very useful in algorithms, callbacks, and event handling. If you're looking for exciting game, let's playing tap road to take on the speed challenge in Tap Road! Tap perfectly to dodge obstacles and unlock higher levels of excitement.
Offline