Лямбда-выражения и их тип
Лямбда-выражения (или просто лямбды) в C++ представляют собой удобный способ создания анонимных функций внутри кода. Они позволяют определять функции на месте и использовать их там же, где они были определены. Тип лямбды зависит от того, какие параметры она принимает и что она возвращает.
Синтаксис лямбда-выражений (лучше см. после всего остального)
Общий формат лямбда-выражения выглядит следующим образом:
[capture list] (parameters) -> return_type {
// тело функции
// return expression (необязательно)
};
- capture list: список захвата переменных из внешней области видимости. Опциональная часть.
- parameters: параметры функции, которые принимает лямбда.
- return_type: тип возвращаемого значения функции (может быть опущен, если функция не возвращает значения).
- тело функции: блок кода, который выполняется при вызове лямбда-функции.
Примеры лямбда-выражений
- Пример без параметров и возвращаемого значения:
[] {
cout << "Hello, Lambda!" << endl;
};
- Пример с параметрами и возвращаемым значением:
[](int a, int b) -> int {
return a + b;
};
Область захвата
Область захвата определяет доступность переменных из внешнего контекста (таких как локальные переменные функции или глобальные переменные) в теле лямбда-выражения. В C++ есть три способа захвата переменных:
- Захват по значению: Захват переменной копирует ее текущее значение в момент создания лямбда-выражения.
int a = 10;
auto lambda1 = [a] {
cout << "Захваченное значение: " << a << endl;
};
- Захват по ссылке: Захват переменной по ссылке позволяет лямбде изменять значение переменной во внешнем контексте.
int b = 5;
auto lambda2 = [&b] {
cout << "Захваченная ссылка: " << b << endl;
};
- Неявный захват: Захват переменных, которые используются в теле лямбды, но не указаны в списке захвата.
int c = 15;
auto lambda3 = [=] {
cout << "Неявно захваченное значение: " << c << endl;
};
- Неявный захват по ссылке: Захват переменных по ссылке, которые используются в теле лямбды, но не указаны в списке захвата.
int d = 20;
auto lambda4 = [&] {
cout << "Неявно захваченная ссылка: " << d << endl;
};
Особенности применения лямбда-функций
-
Удобство и компактность: Лямбда-выражения позволяют определять функции на лету внутри кода, что упрощает написание анонимных функций для различных задач.
-
Использование в алгоритмах: Часто лямбды используются вместе с алгоритмами стандартной библиотеки C++, такими как
std::for_each
,std::sort
,std::transform
и другими, для применения операций к элементам контейнеров.
#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;
int main() {
vector<int> nums = {3, 1, 4, 1, 5, 9, 2, 6, 5};
// Пример: сортировка вектора с использованием лямбда-функции
sort(nums.begin(), nums.end(), [](int a, int b) {
return a > b; // сортировка по убыванию
});
// Вывод отсортированного вектора
for (auto num : nums) {
cout << num << " ";
}
cout << endl;
return 0;
}
-
Захват переменных: Правильный выбор способа захвата переменных важен для корректной работы лямбды. Захваченные переменные должны быть корректно доступны во время выполнения лямбды, учитывая их жизненный цикл и возможные изменения.
-
Понимание контекста: Лямбда-выражения захватывают переменные из внешнего контекста на момент создания. Изменения в захваченных переменных во внешнем контексте после создания лямбды не отражаются внутри лямбды, если она захватила переменную по значению (copy capture).