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 << " ";
});
// 输出每个数字的平方
最后修改于:2025年02月13日 15:29

添加新评论