Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Итог_Пособие C++.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.03 Mб
Скачать

8.5 Лямбда-функции

В стандарте С++11 появилась возможность определения функций непосредственно в месте вызова − так называемых лямбда-функций. Лямбда-функции могут применяться в алгоритмах сортировки и поиска, при этом объем кода, необходимый для их написания, значительно меньше по сравнению с ранее доступными механизмами − функторами и полноценными функциями.

Указатель на лямбда-функцию может быть сохранен в переменную, объявленную с помощью ключевого слова auto. Кроме этого, в лямбда функцию могут быть переданы параметры.

В следующем примере две лямбда-функции lambdaSumm() и lambdaMul() получают в качестве параметров два целых числа и возвращают в качестве результата сумму и произведение соответственно. При этом у функции lambdaSumm() явно указан тип возвращаемого значения. У функции lambdaMul() тип возвращаемого значения определяется автоматически исходя из выражения после оператора return.

// Пример 8.17 - лямбда функции, передача параметров.

auto lambdaSumm = [](int a, int b) -> int { return a + b; };

auto lambdaMul = [](int a, int b) { return a * b; };

std::cout << "Summ: " << lambdaSumm(5, 10) << std::endl;

std::cout << "Mul: " << lambdaMul(5, 10) << std::endl;

Результат работы программы следующий:

Summ: 15

Mul: 50

Важной особенностью лямбда-функции является возможность использования в её теле переменной из той же области видимости, в которой определена сама лямбда-функция. Набор таких переменных называется замыканием и указывается в квадратных скобках. Если перед именем переменной стоит знак амперсанд (&), эта переменная становится доступна функции по ссылке, то есть её значение может быть изменено.

// Пример 8.18 - лямбда функции, замыкания.

int i = 0;

auto myLambdaFunc = [&i]() { ++i; };

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

myLambdaFunc();

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

Результат работы программы следующий:

i: 0

i: 1

Если указано только имя переменной, то она становится доступной по значению, и изменить её из лямбда-функции будет невозможно.

// Пример 8.19 - передача переменных по значению

int a = 5, b = 3;

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

std::cout << lambdaSum() << std::endl;

Результат работы программы следующий:

8

Для передачи переменных может быть использована сокращенная форма записи. Если в квадратных скобках указать знак равно [=], то лямбда-функции будут доступны все переменные из области видимости, в которой объявлена функция, изменять их при этом будет нельзя. Если вместо знака равенства поставить знак амперсанда, все переменные будут доступны по ссылке.

int a = 5, b = 3;

auto lambdaSum = [=](){return a+b;};

std::cout << lambdaSum() << std::endl;

В следующем фрагменте кода показано использование лямбда-функций в качестве предиката в алгоритме сортировки стандартной библиотеки.

// Пример 8.20 - лямбда функция в качестве предиката для сортировки

std::vector<int> intList = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};

std::sort(intList.begin(), intList.end(), [](int a, int b) { return a < b; });

for(auto x: intList) std::cout << x << ' '; std::cout << std::endl;

Результат работы программы следующий:

1 2 3 4 5 6 7 8 9 10

Лямбда-функции могут быть применены ко всем элементам контейнера при помощь алгоритма std::for_each.

// Пример 8.21 - лямбда функция в алгоритме std::for_each

std::vector<int> intList = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};

int summ = 0;

std::for_each(intList.begin(), intList.end(), [&summ](int x) { summ += x; });

std::cout << "Summ: " << summ << std::endl;

Результат работы программы следующий:

Summ: 55

В следующем примере лямбда-функция применяется ко всем элементам контейнера std::vector и выполняет расчет суммы элементов и их количества.

// Пример 8.22 - суммирование элементов вектора

std::vector<int> intList = {1,2,3,4,5};

int summ = 0;

int count = 0;

std::for_each(intList.begin(), intList.end(), [&](int x) {

summ += x;

++count;

});

std::cout << "Summ: " << summ << std::endl;

std::cout << "Count: " << count << std::endl;

Результат работы программы следующий:

Summ: 15

Count: 5

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]