C++ 中的 Lambda 表达式是一种简洁的语法结构,容许在代码中间接定义和应用匿名函数。Lambda 表达式加强了代码的灵活性和可读性,特地是在解决算法、函数对象、事件处理、回调函数等场景下尤为有用。其个别格局如下:
[capture_list](parameter_list) -> return_type {function_body}
各局部具体阐明:
-
捕捉列表(Capture List):
-
[]
是捕捉列表开始的标记,能够为空或者蕴含以下几种捕捉形式:-
=
(值捕捉):捕捉内部作用域中的变量正本,对这些变量的批改不会影响原变量。int x = 10; auto l = [=]() { return x * 2;}; // 捕捉 x 的值,即便之后 x 扭转,l 仍返回 20
-
&
(援用捕捉):捕捉内部作用域中变量的援用,对这些变量的批改会影响原变量。int y = 20; auto m = [&y]() { ++y; return y;}; // 捕捉 y 的援用,调用 m 会减少 y 的值
this
关键字:捕捉以后对象的指针,用于在成员函数外部拜访类的成员。- 不指定任何符号时,默认状况下是非动态局部变量的援用捕捉,同时也会捕捉所有通过值捕捉的内部变量。
复合捕捉也是可能的,例如
[=,&z]
意味着除了z
通过援用捕捉外,其余变量都通过值捕捉。 -
-
-
参数列表(Parameter List):
-
这部分和惯例函数参数列表相似,用于定义 Lambda 承受的输出参数。
auto add = [](int a, int b) {return a + b;};
-
-
返回类型(Return Type):
-
应用
->
后跟返回类型示意 Lambda 的返回值类型,不过在某些状况下能够省略,编译器能够依据函数体内的返回语句主动推断返回类型。// 显式指定返回类型 auto multiply = [](int x, int y) -> int {return x * y;}; // 主动推断返回类型 auto divide = [](double x, double y) {return x / y;}; // 返回 double
-
-
函数体(Function Body):
-
蕴含 Lambda 所执行的操作,即理论的函数逻辑。
auto print = []() {std::cout << "Hello, Lambda!" << std::endl;};
-
综合示例:
#include <iostream>
#include <algorithm>
int main() {int numbers[]{1, 2, 3, 4, 5};
// 应用 lambda 表达式作为 std::count_if 的谓词
int count_divisible_by_3 = std::count_if(numbers, numbers+5, [](int n) {return n % 3 == 0;});
std::cout << "Numbers divisible by 3:" << count_divisible_by_3 << std::endl;
// 援用捕捉的例子
int total = 0;
auto accumulate_values = [&](int value) -> void {total += value;};
for (int i : numbers) {accumulate_values(i);
}
std::cout << "Total of the numbers:" << total << std::endl;
return 0;
}
在这个示例中:
- 第一个 lambda 用于计算数组中能被 3 整除的元素个数,它没有捕捉任何内部变量,只有一个参数列表,并隐式推断出返回类型为 bool。
- 第二个 lambda 是一个无返回值的函数对象,捕捉了内部变量 total 并通过援用,使得每次调用时都能更新 total 的值。