C++ lambda函数用法 [学习笔记]

C++ 的 lambda 函数(也称为匿名函数)是一种轻量级的函数定义方式,可以嵌入代码中并传递给其他函数。以下是 lambda 函数的常见用法和语法详解:


基本语法

[捕获列表](参数列表) -> 返回类型 {
    // 函数体
};
  • 捕获列表: 定义 lambda 函数中可以使用的外部变量。
  • 参数列表: lambda 函数接受的参数,与普通函数相同。
  • 返回类型: 可选,C++14 以后可以自动推断。
  • 函数体: 实现函数的具体逻辑。

示例与用法

1. 简单示例
auto add = [](int a, int b) {
    return a + b;
};
std::cout << add(3, 5) << std::endl; // 输出 8
2. 捕获外部变量
按值捕获
int x = 10, y = 20;
auto lambda = [x, y]() {
    return x + y;
};
std::cout << lambda() << std::endl; // 输出 30
按引用捕获
int x = 10, y = 20;
auto lambda = [&x, &y]() {
    x *= 2;
    y *= 3;
};
lambda();
std::cout << x << ", " << y << std::endl; // 输出 20, 60
隐式捕获
int x = 10, y = 20;
auto lambda = [=]() { // 按值捕获所有外部变量
    return x + y;
};
std::cout << lambda() << std::endl; // 输出 30

auto lambda_ref = [&]() { // 按引用捕获所有外部变量
    x += 5;
    y += 5;
};
lambda_ref();
std::cout << x << ", " << y << std::endl; // 输出 15, 25

3. 指定返回类型
auto divide = [](int a, int b) -> double {
    return static_cast<double>(a) / b;
};
std::cout << divide(10, 3) << std::endl; // 输出 3.33333

4. 在标准算法中使用

C++ 的标准库算法如 std::sortstd::for_eachstd::find_if 经常与 lambda 一起使用。

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

int main() {
    std::vector<int> v = {5, 3, 8, 1, 9};

    // 使用 lambda 自定义排序
    std::sort(v.begin(), v.end(), [](int a, int b) {
        return a > b;
    });

    for (int n : v) std::cout << n << " "; // 输出 9 8 5 3 1
    std::cout << std::endl;

    // 使用 lambda 查找元素
    auto it = std::find_if(v.begin(), v.end(), [](int n) {
        return n % 2 == 0; // 找到第一个偶数
    });
    if (it != v.end()) std::cout << "First even number: " << *it << std::endl; // 输出 8

    return 0;
}

5. 可变 lambda(捕获的值可修改)

默认情况下,按值捕获的变量是只读的,若要修改需加 mutable

int x = 10;
auto lambda = [x]() mutable {
    x += 5; // 修改捕获的值
    return x;
};
std::cout << lambda() << std::endl; // 输出 15
std::cout << x << std::endl;        // 输出 10(原始变量未修改)

6. 将 lambda 作为参数传递
#include <iostream>
#include <functional>

void execute(const std::function<void()>& func) {
    func();
}

int main() {
    execute([]() {
        std::cout << "Lambda as a parameter!" << std::endl;
    });
    return 0;
}

7. 捕获类成员变量
#include <iostream>

class MyClass {
    int x = 42;

public:
    void print() {
        auto lambda = [this]() {
            std::cout << "x = " << x << std::endl;
        };
        lambda();
    }
};

int main() {
    MyClass obj;
    obj.print(); // 输出 x = 42
    return 0;
}

8. 泛型 lambda(C++14 及以上)

泛型 lambda 使用 auto 声明参数,可以处理多种类型。

auto print = [](auto x) {
    std::cout << x << std::endl;
};

print(10);        // 输出 10
print(3.14);      // 输出 3.14
print("Hello!");  // 输出 Hello!

9. Lambda 表达式和多线程
#include <thread>
#include <iostream>

int main() {
    int x = 10;
    std::thread t([x]() {
        std::cout << "Thread started with x = " << x << std::endl;
    });
    t.join();
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值