Matematické Fórum


1. 8. 2026 (L) Fórum bude brzy uzavřeno 😿

Nejste přihlášen(a). Přihlásit

#1 23. 12. 2024 13:47

fmfiain
Příspěvky: 744
Reputace:   -1 
 

Lambda c++

Dobrý deň,
pri svojom štúdiu som narazil na druh funkcie "lambda" v jazyku c++. Aj keď som čítal dokumentáciu, nepochopil som to.
Vedel by mi to niekto vysvetliť?

Ďakujem.

Offline

 

#2 23. 12. 2024 16:34

MichalAld
Moderátor
Příspěvky: 5367
Reputace:   130 
 

Re: Lambda c++

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

 

#3 23. 12. 2024 18:21

fmfiain
Příspěvky: 744
Reputace:   -1 
 

Re: Lambda c++

Dobrý deň ↑ MichalAld:,
mám takýto príklad:

Code:

auto f = [parametre1] (parametre2) {parametre3}

Mohol by si mi definovať, čo sú to: parametre1, parametre2 a parametre3?

Ďakujem.

Offline

 

#4 23. 12. 2024 18:47 — Editoval MichalAld (23. 12. 2024 18:48)

MichalAld
Moderátor
Příspěvky: 5367
Reputace:   130 
 

Re: Lambda c++

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

 

#5 23. 12. 2024 20:27 — Editoval fmfiain (23. 12. 2024 20:48)

fmfiain
Příspěvky: 744
Reputace:   -1 
 

Re: Lambda c++

Dobrý deň ↑ MichalAld:,
parametre2 a 3 už rozumiem. Ešte parametre1.

Offline

 

#6 23. 12. 2024 20:34 — Editoval fmfiain (23. 12. 2024 20:51)

fmfiain
Příspěvky: 744
Reputace:   -1 
 

Re: Lambda c++

Dobrý deň ↑ MichalAld:,

Code:

// 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

 

#7 23. 12. 2024 22:21

MichalAld
Moderátor
Příspěvky: 5367
Reputace:   130 
 

Re: Lambda c++

Detaily toho co je v hranatých závorkách si raději vyzkoušej, já to úplně najisto nevím.

Offline

 

#8 24. 12. 2024 12:28

MichalAld
Moderátor
Příspěvky: 5367
Reputace:   130 
 

Re: Lambda c++

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

 

#9 24. 12. 2024 12:38

MichalAld
Moderátor
Příspěvky: 5367
Reputace:   130 
 

Re: Lambda c++

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

 

#10 25. 12. 2024 08:18

fmfiain
Příspěvky: 744
Reputace:   -1 
 

Re: Lambda c++

Dobrý deň ↑ MichalAld:,
ja som len zistil, že [=, &m] je volanie odkazom. Na ostatné sa budem musieť pozrieť. A [&, m] je volanie hodnotou.

Offline

 

#11 25. 12. 2024 10:14

fmfiain
Příspěvky: 744
Reputace:   -1 
 

Re: Lambda c++

Dobrý deň ↑ MichalAld:,
ak zmením lambda funkciu (1):

Code:

// 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):

Code:

// 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):

Code:

// 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):

Code:

// 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

 

#12 25. 12. 2024 12:07

MichalAld
Moderátor
Příspěvky: 5367
Reputace:   130 
 

Re: Lambda c++

No ano, tak by to mělo být, přesně jak píšeš.

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson