C++中的Lambda表达式
Lambda 表达式是 C++11 的新特性,一种定义匿名函数的简洁方式。
Lambda 表达式可以捕获外部作用域的变量,也可以作为参数传给函数或变量。
lambda语法
[capture-list] (parameters) -> return-type { function-body }
- Capture list(捕获列表):指定Lambda表达式可以访问哪些外部变量。
- Parameters(参数列表):Lambda表达式的参数。
- Return type(返回类型):Lambda表达式的返回类型。
- Function body(函数体):Lambda表达式执行的代码块。
1. 简单的Lambda表达式
最简单的Lambda表达式不需要捕获任何变量,也没有返回类型:
#include <iostream>
int main() {
auto simpleLambda = []() {
std::cout << "Hello, Lambda!" << std::endl;
};
simpleLambda(); // 调用Lambda表达式
return 0;
}
2. 捕获外部变量
Lambda 表达式可以捕获外部作用域中的变量。有两种捕获方式:
- 按值捕获:使用方括号
[var]
捕获变量的副本。 - 按引用捕获:使用方括号
[&var]
捕获变量的引用。
示例代码
#include <iostream>
int main() {
int x = 10;
auto captureByValue = [x]() {
std::cout << "Captured by value: " << x << std::endl;
};
auto captureByReference = [&x]() {
std::cout << "Captured by reference: " << x << std::endl;
x++;
};
captureByValue();
captureByReference();
std::cout << "After capture: " << x << std::endl;
return 0;
}
3. 捕获所有外部变量
使用 [=]
捕获所有外部变量的副本,或使用 [&]
捕获所有外部变量的引用。
示例代码
#include <iostream>
int main() {
int x = 10;
int y = 20;
auto captureAllByValue = [=]() {
std::cout << "x: " << x << ", y: " << y << std::endl;
};
auto captureAllByReference = [&]() {
std::cout << "x: " << x << ", y: " << y << std::endl;
x++;
y++;
};
captureAllByValue();
captureAllByReference();
std::cout << "After capture: x: " << x << ", y: " << y << std::endl;
return 0;
}
4. Lambda 表达式的参数和返回类型
Lambda 表达式的参数列表和返回类型。
示例代码
#include <iostream>
#include <algorithm>
int main() {
int a = 10;
int b = 20;
auto maxOfTwo = [](int x, int y) -> int {
return (x > y) ? x : y;
};
int max_value = maxOfTwo(a, b);
std::cout << "Max value: " << max_value << std::endl;
return 0;
}
5. Lambda 表达式作为比较器
Lambda 表达式作为比较器传递给函数,例如 std::sort
。
示例代码
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> numbers = {5, 3, 9, 1, 7};
std::sort(numbers.begin(), numbers.end(), [](int a, int b) {
return a < b;
});
for (int num : numbers) {
std::cout << num << " ";
}
std::cout << std::endl;
return 0;
}