Matematické Fórum

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

#1 23. 12. 2024 13:47

fmfiain
Příspěvky: 734
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: 5178
Reputace:   127 
 

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: 734
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: 5178
Reputace:   127 
 

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: 734
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: 734
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: 5178
Reputace:   127 
 

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: 5178
Reputace:   127 
 

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: 5178
Reputace:   127 
 

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: 734
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: 734
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: 5178
Reputace:   127 
 

Re: Lambda c++

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

Offline

 

#13 27. 12. 2024 05:44 — Editoval snowmanplayer (30. 12. 2024 05:06)

snowmanplayer
Zelenáč
Příspěvky: 1
Reputace:   
 

Re: Lambda c++

↑ 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

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson