Files
PPC/Funktory a Lambda funkce.md

2.8 KiB

Funktory

Jsem línej to víc rozepsat... pozn. pro sebe dodělat funktory potom. Teď mám přibližné vysvětlení v Přetěžování operátorů. Prostě to je objekt, co se chová jako funkce, ale je uložený jako objekt (jako proměnná) v kódu a může mít vnitřní funkce a proměnné. Užitečné to je třeba když chci funkci, co si umí pamatovat data z každého zavolání (třeba sčítá všechny čísla, co do ní jsou poslány jako argumenty).

Lambda funkce

Lambdy jsou divný... ale užitečný. Jde o to, že někdy chci mít možnost napsat hodně rychlou funkci, bez toho, abych ji někde musel definovat. Vytvořím tedy vlastně funkci do proměnné, a využiji ji přímo na místě a pak ji třeba hned zahodím.

Syntax:

[](int a, int b) {return a + b;}

což je [capture](parametry) -> návratový_typ { tělo } ale hodně je optional... (třeba capture) obrzazek gfg

Příklad: Řekněme, že si někde potřebuju nutně definovat sčítání (protože mám hloupý cpp a zapomnělo to, nebo idk :( )

auto add = [](int a, int b) {return a + b;};

int x = add(3,4);

Mám zde funkci, co je vlastně "uložená v proměnné". Ve skutečnosti je to ale jenom funktor tedy alternativa pro:

class __Lambda123
{
public:
    int operator()(int x, int y)
    const {
        return x + y;
    }
};

__Lambda123 add;

**Lambda funkce se musí ukládat do proměnných typu auto!!

Co je capture? Lambda funkce umožňuje přijmout hodnoty/proměnné z lokálního bloku a dále s nimi pracovat jako s vlastními proměnnými. Mám 2 typy capture a to capture by reference a capture by value. Jedno mi umožňuje vzít referenci k proměnným/objektům a v lambdě je měnit. Druhé mi umožňuje hodnoty do lambdy prostě zkopírovat.

Př: (ukradeno z geeks for geeks)

int main() {
    vector<int> vec1 = {10, 20, 30, 40, 50}; //vektory jsou jako pole
    vector<int> vec2 = {1, 2, 3, 4, 5};
    
    auto lambda = [&vec1, vec2]() //& je ref. a druhé je pouze hodnota
    {
        for (int& num : vec1) {num *= 10;}
        for (int num : vec2) {cout << num * 10 << " ";}
        cout << endl;
    };
    
    lambda();
    
    cout << "Vector 1: ";
    for (int num : vec1) cout << num << " ";
    
    cout << "\nVector 2: ";
    for (int num : vec2) cout << num << " ";
    
    return 0;
}

Další možnosti:

auto lambda1 = [&](int x){}; //VŠECHNY externí proměnné jako refernec
auto lambda2 = [=](int x){}; //VŠECHNY externí proměnné jako hodnotu