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的值。