C++ Lambda expression

Lambda expression:

[capture_list] (params_list) mutable exception-> return_type { function_body }

Capture list: 捕捉外部变量列表

Params list: 变量列表

mutable 指示符: 说明是否可以修改捕捉的变量

exception: 异常说明

return type: 返回类型

function body: 函数体

此外,我们还可以省略其中的某些成分来声明“不完整”的Lambda表达式,常见的有以下几种:

[capture_list] (params_list) -> return_type { function_body }
[capture_list] (params_list) { function_body }
[capture_list] { function_body }


    int o = [] (int n) ->int { return n; }(2);

    cout << o << endl;// 2

    cout << [](int x,int y) { return x + y; }(2,3) << endl;  // n: 5

    

    

    int m = [](int x) {return [](int y) {return y * 2; }(x) +1; }(3);

    cout << m << endl// 7

    

    

    auto gFunc = [](int x) ->function<int(int)> {return [=](int y) {return x + y; }; };

    auto lFunc = gFunc(4);

    std::cout << lFunc(5) <<endl// 9

    

    auto hFunc = [](constfunction<int(int)>& f,int z) { return f(z) +1; };

    cout << hFunc(gFunc(7),8) << endl;// 16

    

    int a = 11, b =22;

    auto func = [=, &b]()mutable { a =111; b = 222;cout << "a:" << a <<" b:" << b << endl; };

    func(); // a:111 b:222

    cout << "a:" << a <<" b:" << b << endl;// a:11 b:222

    auto func2 = [=, &a] { a = 111; cout << "a:" << a << " b:" << b << endl; };

    func2(); // a:111 b:222





C++ Lambda表达式是一种简洁、灵活且安全的定义匿名函数的方式,相比于普通函数和普通类具有显著优势,本质上是一个匿名类的对象,可赋值给函数指针或引用,也能作为模板参数传递给泛型函数或类。C++14 和 C++17 对其进行了扩展和改进,使其更加强大和灵活 [^1][^2]。 ### 使用方法 Lambda表达式的基本语法如下: ```plaintext [capture clause](parameters) -> return_type { // 函数体 // 可以使用捕获列表中的变量 return expression; // 可选的返回语句 } ``` 其中,`[capture clause]` 用于捕获外部变量,`(parameters)` 是参数列表,`-> return_type` 为返回值类型(可选),`{}` 内是函数体 [^3]。 在lambda函数定义中,参数列表和返回值类型都是可选部分,而捕捉列表和函数体可以为空。以下是一些示例: ```cpp #include <iostream> int main() { // 最简单的lambda函数,不做任何事情 []{}; // 有参数和返回值类型指定 auto add1 = [](int x, int y) -> int { return x + y; }; std::cout << add1(1, 2) << std::endl; // 有返回值类型指定,无参数 auto func1 = []() -> int { std::cout << "hello world" << std::endl; return 0; }; func1(); // 返回值类型自动推导,无参数 auto func2 = [] { std::cout << "hello world" << std::endl; return 0; }; std::cout << func2() << std::endl; // 无返回值,无参数 auto func3 = [] { std::cout << "hello world" << std::endl; }; func3(); // 捕获外部变量 int a = 5; char c = 'A'; [a, c]() { std::cout << a << c << std::endl; }(); // 捕获外部变量,有参数和返回值 auto tmpFunc = [a, c](int b, char d) -> int { std::cout << "外部变量a=" << a << " 外部变量c=" << c << std::endl; std::cout << "参数b=" << b << " 参数d=" << d << std::endl; return a; }; int k = tmpFunc(10, 'B'); std::cout << k << std::endl; return 0; } ``` ### 特性 - **简洁**:无需定义具名函数,可在需要的地方直接定义和使用,使代码更加简洁 [^2]。 - **灵活**:可以捕获外部变量,根据不同的上下文灵活调整行为。捕获方式有值捕获、引用捕获等。 - **安全**:作为匿名对象,作用域相对局限,减少了命名冲突和全局变量的使用,提高了代码的安全性 [^2]。 - **泛型支持**:C++14 引入了泛型 Lambda,允许使用 `auto` 作为参数类型,增强了代码的通用性。 - **初始化捕获**:C++14 支持初始化捕获,允许在捕获列表中初始化新的变量。 - **捕获 `this` 指针**:可以捕获 `this` 指针,以便在 Lambda 表达式中访问类的成员变量和成员函数 [^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值