C++ lambda表达式

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;
}
C++ Lambda表达式是一种简洁的匿名表示方法,可以在代码中定义并使用。Lambda表达式的格式一般为:[] (参数列表) mutable -> 返回值类型 { 表达式 }。Lambda表达式可以捕获外部变量,并将其作为参数传递给函数体部分进行处理。Lambda表达式在使用时可以作为函数对象、函数指针或者函数参数进行传递。 Lambda表达式的底层原理是通过生成一个匿名类来实现。该类会重载函数调用运算符(),并包含Lambda表达式的函数体。Lambda表达式中捕获的外部变量会以成员变量的形式存储在该类中。当Lambda表达式被调用时,实际上是调用了该类的重载函数调用运算符()。 Lambda表达式可以与std::function结合使用,以实现函数对象的灵活使用。也可以将Lambda表达式赋值给相同类型的函数指针,实现函数指针的使用。但一般不建议这样使用,因为Lambda表达式已经提供了更加方便和简洁的方式。 总结来说,C++ Lambda表达式是一种用于定义匿名函数的语法,可以捕获外部变量并进行处理。其底层通过生成一个匿名类来实现,并提供了与std::function和函数指针的结合使用方式。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [C++11:lambda表达式](https://blog.csdn.net/zhang_si_hang/article/details/127117260)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值