Lambda funkce
C++ 11

image_printTisk

Tento článek popisuje nový syntaktický zápis funkcí a různých operací. Tento zápis se nazývá lambda funkce nebo lambda výrazy a je primárně určen pro předávání operací jako argument do jiných funkcí. Jejich využití se nachází mimo jiné v STL algoritmech ve formě operací, unárních a binárních predikátů.

Lambda funkce může fungovat podobně jako klasická funkce. Ukažme si na následující ukázce, jak to asi může vypadat.

#include <iostream>
#include <vector>
using namespace std;

void print(const vector<int>& vec) {
    for(auto val : vec)
        cout << val << ";";
    cout << endl;
}

auto lambdaPrint = [](const vector<int>& vec) {
    for(auto val : vec)
        cout << val << ";";
    cout << endl;
};

int main() {
    print({1, 2, 3 , 4, 5});
    lambdaPrint({5, 4, 3, 2, 1});
    return 0;
}
Unable to connect to the JDoodle service.
  1. Lamda je další funkce
    1. srovnání lambda bez capture listu s funkcí a deklarací auto
    2. a zavolání
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

ostream& operator<<(ostream& os, vector<int>& data) {
    for(auto c : data)
        os << c << ";";
    return os;
}

int main() {
    int start = 0;
    auto generator1 = [=]() {
        static int i = 0;
        return start + (++i);
    };
    auto generator2 = [&]() mutable { return ++start; };
    
    const int len = 10;
    vector<int> data(len);
    
    start = 5;
    generate_n(data.begin(), len, generator1);
    cout << "start = " << start << ", " << data << endl;
    
    start = 10;
    generate_n(data.begin(), len, generator2);
    cout << "start = " << start << ", " << data << endl;
    
    return 0;
}
Unable to connect to the JDoodle service.
  1. Zachytáváme okolí
  2. Vše kopií
  3. Vše referencí
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

ostream& operator<<(ostream& os, vector<int>& vec) {
    for(auto val : vec)
        cout << val << ";";
    return os;
}

int main() {
    int value = 0;
    int increment = 1;
    bool isNegative = true;
    
    auto generator = [value, isNegative, &increment]() mutable {
        isNegative = ! isNegative;
        if(isNegative) {
            return -(value + increment++);
        } else {
            return value + increment++;
        }
    };
    
    const int len = 10;
    vector<int> data(len);
    generate_n(begin(data), len, generator);
    cout << data << endl;
    
    return 0;
}
Unable to connect to the JDoodle service.
  1. Vybrané proměnné
image_printTisk
Lambda funkce
C++ 11
Ohodnoťte tento článek

Související články

  • Metody předávání hodnot argumentů funkcím Tento článek pojednává o způsobech či metodách, jak lze předávat hodnoty argumentů volaným funkcím. V zásadě existují dva přístupy. Prvním je předání hodnotou, druhým je předání […]
  • Funkce a její parametry V tomto článku si blíže vysvětlíme pojem funkce v C++, seznámíme se s jejím syntaktickým zápisem včetně zápisu formálních parametrů a dále bude vysvětleno, jak se z funkcí provádí vracení […]
  • Reference V tomto článku si vysvětlíme nový prvek jazyka C++, a to jsou reference. Jejich funkce je obdobná jako u ukazatelů, jsou tu avšak určité rozdíly, které je třeba mít na paměti. Jak […]
  • Paměťový buffer – třída “stringstream” V této kapitole uzavřeme téma kolem vstupu a výstupu. Zatím jsme si ukázali, jak je možné provádět vstup a výstup na textovou konzoli a do souboru. Tato kapitola popisuje poslední datový […]
  • Operátory podrobněji V předchozích článcích jsme se seznámili již s několika typy základních operátorů v C++. Tato kapitola slouží k představení zbytku operátorů, které se v jazyce C++ […]
  • Sekvenční algoritmy “all_of”, “any_of” a “none_of” V tomto článku si popíšeme sekvenční algoritmy all_of, any_of a none_of. Jejich princip spočívá v tom, že se jim v argumentu předá testovací operace, reprezentovaná nejčastěji lambda […]