Рубрики

Лямбда-выражение в C ++

В C ++ 11 введено лямбда-выражение, позволяющее нам написать встроенную функцию, которую можно использовать для коротких фрагментов кода, которые не будут использоваться повторно и которые не стоит называть. В простейшем виде лямбда-выражение можно определить следующим образом:


[ capture clause ] (parameters) -> return-type  
{   
   definition of method   
} 

Обычно возвращаемый тип в лямбда-выражении оценивается самим компилятором, и нам не нужно явно указывать, что часть возвращаемого типа и -> можно игнорировать, но в некоторых сложных случаях, как в условном выражении, компилятор не может разобрать возвращаемое значение типа, и мы должны указать это.
Различные варианты использования лямбда-выражения со стандартной функцией приведены ниже:

// C ++ программа для демонстрации лямбда-выражения в C ++
#include <bits/stdc++.h>

using namespace std;

  
// Функция для печати вектора

void printVector(vector<int> v)

{

    // лямбда-выражение для вывода вектора

    for_each(v.begin(), v.end(), [](int i)

    {

        std::cout << i << " ";

    });

    cout << endl;

}

  

int main()

{

    vector<int> v {4, 1, 3, 5, 2, 3, 1, 7};

  

    printVector(v);

  

    // ниже фрагмента найти первое число больше 4

    // find_if ищет элемент, для которого

    // функция (третий аргумент) возвращает true

    vector<int>:: iterator p = find_if(v.begin(), v.end(), [](int i)

    {

        return i > 4;

    });

    cout << "First number greater than 4 is : " << *p << endl;

  

  

    // функция для сортировки вектора, лямбда-выражение для сортировки в

    // Неубывающий порядок Компилятор может определить тип возвращаемого значения как

    // bool, но показано здесь только для объяснения

    sort(v.begin(), v.end(), [](const int& a, const int& b) -> bool

    {

        return a > b;

    });

  

    printVector(v);

  

    // функция для подсчета чисел больше или равных 5

    int count_5 = count_if(v.begin(), v.end(), [](int a)

    {

        return (a >= 5);

    });

    cout << "The number of elements greater than or equal to 5 is : "

         << count_5 << endl;

  

    // функция удаления дублирующего элемента (после сортировки всех

    // дубликат приходит вместе)

    p = unique(v.begin(), v.end(), [](int a, int b)

    {

        return a == b;

    });

  

    // изменение размера вектора, чтобы сделать размер равным общему количеству

    v.resize(distance(v.begin(), p));

    printVector(v);

  

    // функция накопления накапливает контейнер на основе

    // функция предоставляется в качестве третьего аргумента

    int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

    int f = accumulate(arr, arr + 10, 1, [](int i, int j)

    {

        return i * j;

    });

  

    cout << "Factorial of 10 is : " << f << endl;

  

    // Мы также можем получить доступ к функции, сохранив ее в переменной

    auto square = [](int i)

    {

        return i * i;

    };

  

    cout << "Square of 5 is : " << square(5) << endl;

}

Выход:

4 1 3 5 2 3 1 7 
First number greater than 4 is : 5
7 5 4 3 3 2 1 1 
The number of elements greater than or equal to 5 is : 2
7 5 4 3 2 1 
Factorial of 10 is : 3628800
Square of 5 is : 25

Лямбда-выражение может иметь больше возможностей, чем обычная функция, имея доступ к переменным из окружающей области. Мы можем захватить внешние переменные из охватывающей области видимости тремя способами:
Захват по ссылке
Захват по значению
Захват обоими (смешанный захват)

Синтаксис, используемый для захвата переменных:
[&]: захватить всю внешнюю переменную по ссылке
[=]: захватить всю внешнюю переменную по значению
[a, & b]: захватить по значению и b по ссылке

Лямбда с пустым предложением захвата [] может обращаться только к тем переменным, которые для нее локальны.
Способы захвата продемонстрированы ниже:

// C ++ программа для демонстрации лямбда-выражения в C ++
#include <bits/stdc++.h>

using namespace std;

  

int main()

{

    vector<int> v1 = {3, 1, 7, 9};

    vector<int> v2 = {10, 2, 7, 16, 9};

  

    // доступ к v1 и v2 по ссылке

    auto pushinto = [&] (int m)

    {

        v1.push_back(m);

        v2.push_back(m);

    };

  

    // он выдвигает 20 в v1 и v2

    pushinto(20);

  

    // доступ к v1 по копии

    [v1]()

    {

        for (auto p = v1.begin(); p != v1.end(); p++)

        {

            cout << *p << " ";

        }

    };

  

    int N = 5;

  

    // ниже фрагмента найти первое число больше чем N

    // [N] обозначает, может получить доступ только к N по значению

    vector<int>:: iterator p = find_if(v1.begin(), v1.end(), [N](int i)

    {

        return i > N;

    });

  

    cout << "First number greater than 5 is : " << *p << endl;

  

    // функция для подсчета чисел, больших или равных N

    // [=] обозначает, может получить доступ ко всем переменным

    int count_N = count_if(v1.begin(), v1.end(), [=](int a)

    {

        return (a >= N);

    });

  

    cout << "The number of elements greater than or equal to 5 is : "

         << count_N << endl;

}

Выход:

First number greater than 5 is : 7
The number of elements greater than or equal to 5 is : 3

Лямбда-выражение может работать только на C ++ 11 и более поздних версиях.

Эта статья предоставлена Уткаршем Триведи. Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой теме

Рекомендуемые посты:

Лямбда-выражение в C ++

0.00 (0%) 0 votes