C++11 引入了 lambda 表达式,这是一种定义匿名函数的简便方式。它允许你定义匿名的内联函数对象。这些函数对象可以捕获其所在作用域中的变量,并且可以用于需要函数对象的任何地方,如算法或函数回调。Lambda 表达式特别适用于需要一个函数对象,但该函数对象只会被调用一次的情况。Lambda 表达式的基本语法如下:
[capture](parameters) -> return_type { body }
[capture]
:捕获子句,用于捕获 lambda 函数体外的变量。(parameters)
:参数列表,与普通函数的参数列表相同。-> return_type
:返回类型,当 lambda 函数体只有一条返回语句时可以省略。{ body }
:函数体,即 lambda 函数要执行的代码。
在捕获子句中,可以使用不同的捕获方式:
[]
:不捕获任何外部变量。[=]
:以值捕获所有外部变量(变量会被复制)。[&]
:以引用捕获所有外部变量(变量不会被复制)。[var]
:以值捕获指定的外部变量var
。[&var]
:以引用捕获指定的外部变量var
。[=, &var]
或[var, &...]
:混合捕获方式,首先以值捕获所有外部变量,但指定的变量var
以引用捕获,或者先以值捕获除var
外的所有外部变量,然后var
以引用捕获,等等。
示例代码
示例 1:无参数、无返回值、无捕获的 lambda
#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> nums = {1, 2, 3, 4, 5};std::for_each(nums.begin(), nums.end(), [](int n) {std::cout << n << std::endl;});return 0;
}
示例 2:有参数、有返回值、无捕获的 lambda
#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> nums = {1, 4, 9, 16, 25};int sum = std::accumulate(nums.begin(), nums.end(), 0, [](int a, int b) {return a + b * b; // 假设这里我们对每个元素平方后再求和});std::cout << "Sum: " << sum << std::endl; // 输出: Sum: 55 (1 + 16 + 81 + 256 + 625)return 0;
}
示例 3:有参数、有返回值、有捕获的 lambda
#include <iostream>
#include <vector>
#include <algorithm>int main() {int x = 10;std::vector<int> nums = {1, 2, 3, 4, 5};std::transform(nums.begin(), nums.end(), nums.begin(), [x](int n) {return n * x; // 使用捕获的变量 x 来乘以每个元素});for (int num : nums) {std::cout << num << " "; // 输出: 10 20 30 40 50}return 0;
}