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.
Online
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
Online
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.
Online
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ě.
Online
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