C++ lambda函数

本文详细介绍了C++中的Lambda表达式,包括基本语法、捕获列表选项、示例以及C++14和C++17后的增强功能,特别强调了其在简化代码和STL算法中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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)。

### C++ Lambda 表达式简介 Lambda 表达式是 C++11 标准引入的一种匿名函数,可以在需要函数对象的地方直接编写代码块,而无需定义一个完整的函数。这种特性极大地提高了代码的简洁性和可读性。 #### 基本语法结构 Lambda 表达式的通用形式如下: ```cpp [capture](parameters) -> return_type { // function body } ``` - `capture`:捕获列表,用于指定外部变量如何被捕获。 - `parameters`:参数列表,类似于普通函数的参数声明。 - `return_type`:返回类型,默认情况下可以省略,编译器会自动推断。 - `function body`:函数体,即执行的具体逻辑。 #### 捕获机制 捕获列表决定了 lambda 函数能否访问其所在作用域中的局部变量和 this 指针。常见的捕获方式有: - **按值捕获**:使用 `[=]` 将所有外部变量按值复制到闭包中。 - **按引用捕获**:使用 `[&]` 将所有外部变量按引用传递给闭包。 - **混合捕获**:可以选择特定变量按值或按引用捕获,例如 `[a, &b]`。 #### 实际应用场景 ##### 并行编程中的应用 在多线程环境中,lambda 可以简化任务创建与管理过程。下面是一个简单的例子展示如何利用 lambda 启动一个新的工作线程[^2]: ```cpp #include <iostream> #include <thread> using namespace std; int main() { // 使用 Lambda 创建一个新线程 thread t([]() { cout << "Hello from thread!" << endl; }); t.join(); // 等待子线程完成 return 0; } ``` 此程序启动了一个新的线程来打印消息,并通过调用 join 方法等待该线程结束前不会继续执行主线程后续操作。 ##### STL 算法库的应用 当配合标准模板库 (STL) 的迭代器算法时,lambda 能够让代码更加紧凑易懂。比如对容器内元素进行过滤处理: ```cpp #include <algorithm> #include <vector> #include <iostream> using namespace std; void print_even_numbers(const vector<int>& nums) { copy_if(nums.begin(), nums.end(), ostream_iterator<int>(cout, "\n"), [](int n){ return n % 2 == 0; }); // 这里使用了 lambda 来实现偶数筛选条件 } int main(){ vector<int> numbers{1, 2, 3, 4, 5}; print_even_numbers(numbers); return 0; } ``` 这段代码遍历输入向量并将其中所有的偶数值输出至控制台。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值