C++ lambda函数

C++中的Lambda表达式是一种方便的定义匿名函数对象的方式。自C++11起,Lambda表达式被引入为C++的一部分。以下是Lambda表达式的基本语法和一些变体。

基本语法:

[ capture_clause ] ( parameters ) -> return_type {
    function_body
}
  • capture_clause: 捕获列表,定义了Lambda表达式可以从封闭作用域(通常是定义Lambda的函数)捕获的变量。它可以是值捕获、引用捕获或隐式捕获。
  • parameters: 参数列表,与普通函数的参数列表类似。
  • return_type: 返回类型,可以不写,编译器会自动推导。
  • function_body: 函数体,包含Lambda表达式要执行的代码。

捕获列表的选项:

  • []: 不捕获任何外部变量。
  • [x, &y]: 按值捕获 x,按引用捕获 y
  • [=]: 按值捕获所有外部变量。
  • [&]: 按引用捕获所有外部变量。
  • [=, &y]: 按值捕获所有外部变量,但按引用捕获 y
  • [&, x]: 按引用捕获所有外部变量,但按值捕获 x
  • [this]: 捕获当前对象(*this)的指针。

示例:

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    int x = 10;
    int y = 20;

    // 值捕获
    auto lambda_val = [x]() { std::cout << "Value of x: " << x << std::endl; };
    lambda_val(); // 输出: Value of x: 10

    // 引用捕获
    auto lambda_ref = [&y]() { std::cout << "Value of y: " << y << std::endl; };
    lambda_ref(); // 输出: Value of y: 20

    // 修改捕获的引用变量
    auto add_to_y = [&y](int val) { y += val; };
    add_to_y(5); // y 现在是 25

    // 隐式值捕获
    auto sum = [=]() { return x + y; };
    std::cout << "Sum: " << sum() << std::endl; // 输出: Sum: 35

    // 隐式引用捕获
    std::vector<int> numbers = {1, 2, 3, 4, 5};
    std::for_each(numbers.begin(), numbers.end(), [&](int &n) { n *= 2; });

    // 带返回类型
    auto max = [](int a, int b) -> int { return a > b ? a : b; };
    std::cout << "Max of 3 and 5: " << max(3, 5) << std::endl; // 输出: Max of 3 and 5: 5

    // 无参数Lambda
    auto say_hello = []() { std::cout << "Hello, World!" << std::endl; };
    say_hello(); // 输出: Hello, World!

    return 0;
}

Lambda表达式非常灵活,支持几乎所有的函数能做的事情,并且由于其匿名性质,Lambda表达式常被用于简化代码,特别是在STL算法中作为回调函数使用。在C++14和C++17中,Lambda表达式得到了进一步的增强,包括捕获列表中的初始化捕获(C++14)和模板参数(C++20)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值