Cpp-05-Lambda表达式
C++中的Lambda表达式提供了一种简洁的方式来定义匿名函数对象,这些对象可以在需要回调函数的地方使用。它们在C++11中首次引入,并在后续的标准版本中得到了增强。以下是关于如何使用Lambda表达式的全面说明,包括语法和一些示例。
基本语法
[capture](parameters) -> return_type { body }
- Capture list (
[capture]
):用于指定哪些外部变量可以从lambda内部访问,以及是以值(通过=
)还是以引用(通过&
)的方式访问。 - Parameters (
(parameters)
): 类似于普通函数的参数列表。 - Return type (
-> return_type
): 可选,用来显式指定返回类型。如果省略编译器通常可以自动推断返回类型。 - Body (
{body}
): Lambda的实际逻辑代码。
示例
1. 没有参数,没有捕获列表
一个简单的Lambda表达式,打印一条消息:
[]() { std::cout << "Hello from lambda!" << std::endl; }();
2. 使用参数
接受一个整数并打印它:
[](int x) { std::cout << "The number is " << x << std::endl; }(5);
3. 返回值
返回两个数之和:
auto add = [](int a, int b) -> int { return a + b; };
std::cout << "Sum: " << add(3, 4) << std::endl;
4. 捕获局部变量
使用值捕获(=
)或引用捕获(&
)来访问外部变量:
int multiplier = 6;
auto multiply = [multiplier](int value) { return value * multiplier; };
std::cout << "Result: " << multiply(5) << std::endl; // 输出 30
使用引用捕获修改外部变量:
int external = 10;
auto lambda = [&external]() { ++external; };
lambda();
std::cout << "External is now " << external << std::endl; // 输出 11
5. 混合捕获方式
同时使用值和引用捕获:
int x = 1, y = 2;
auto mixed = [x, &y]() { std::cout << x << ", " << ++y << std::endl; };
mixed(); // 输出 "1, 3"
6. Lambda作为参数传递
将lambda作为参数传递给函数:
void execute(std::function<void()> func) {
func();
}
execute([]() { std::cout << "Executed from passed lambda!" << std::endl; });
7. Lambda与标准算法
使用lambda表达式简化STL算法的使用:
std::vector<int> numbers = {1, 2, 3, 4, 5};
std::for_each(numbers.begin(), numbers.end(), [](int n) {
std::cout << n * n << " ";
});
// 输出每个数字的平方