Lambda 表达式(Lambda Expression)是在 C++11 中引入的一种匿名函数,允许你在需要使用函数对象的地方定义一个内联函数。Lambda 表达式可以捕获其所在作用域中的变量,方便简洁地创建短小的回调函数或排序规则。
Lambda 表达式的语法
[captures](parameters) -> return_type {
// function body
}
- captures: 捕获列表,指定哪些变量可以被 Lambda 表达式捕获。可以通过值捕获或引用捕获。
- parameters: 参数列表,与普通函数的参数列表相似。如果没有参数,可以省略括号。
- return_type: 返回类型,可以通过
->
指定。如果省略,编译器会自动推断返回类型。 - function body: 函数体,包含 Lambda 表达式的具体逻辑。
捕获列表的用法
[ ]
空捕获列表,表示不捕获任何变量。[x]
通过值捕获变量x
。[&x]
通过引用捕获变量x
。[=]
通过值捕获所有外部作用域中的变量(按值捕获)。[&]
通过引用捕获所有外部作用域中的变量(按引用捕获)。[=, &y]
通过值捕获所有变量,但y
通过引用捕获。[&, x]
通过引用捕获所有变量,但x
通过值捕获。
示例代码
1. 基本的 Lambda 表达式
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> vec = {5, 2, 9, 1, 5, 6};
// 使用 Lambda 表达式进行排序(升序)
std::sort(vec.begin(), vec.end(), [](int a, int b) {
return a < b;
});
std::cout << "Sorted vector (ascending order): ";
for (int num : vec) {
std::cout << num << " ";
}
std::cout << std::endl;
return 0;
}
2. 带捕获列表的 Lambda 表达式
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> vec = {5, 2, 9, 1, 5, 6};
int threshold = 5;
// 使用 Lambda 表达式进行排序,按与 threshold 的距离升序
std::sort(vec.begin(), vec.end(), [threshold](int a, int b) {
return abs(a - threshold) < abs(b - threshold);
});
std::cout << "Sorted vector (by distance to threshold): ";
for (int num : vec) {
std::cout << num << " ";
}
std::cout << std::endl;
return 0;
}
3. 带返回类型的 Lambda 表达式
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> vec = {5, 2, 9, 1, 5, 6};
// 使用 Lambda 表达式进行排序(降序),并显式指定返回类型
std::sort(vec.begin(), vec.end(), [](int a, int b) -> bool {
return a > b;
});
std::cout << "Sorted vector (descending order): ";
for (int num : vec) {
std::cout << num << " ";
}
std::cout << std::endl;
return 0;
}
捕获外部变量
Lambda 表达式可以捕获外部作用域的变量,从而在函数体内使用这些变量。
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> vec = {5, 2, 9, 1, 5, 6};
int addValue = 3;
// 通过引用捕获 addValue,并将其加到每个元素上
std::for_each(vec.begin(), vec.end(), [&addValue](int &x) {
x += addValue;
});
std::cout << "Modified vector: ";
for (int num : vec) {
std::cout << num << " ";
}
std::cout << std::endl;
return 0;
}
总结
Lambda 表达式是 C++11 引入的一种方便的匿名函数形式,用于简化函数对象的创建。通过捕获列表,Lambda 表达式可以访问和修改其所在作用域中的变量,从而提供了更灵活和简洁的编程方式。