C++ | Lambda表达式

引言

在C++11之前,想要在函数中传递可调用对象(如函数指针、仿函数)往往需要繁琐的代码,尤其是在STL算法中使用自定义逻辑时。C++11引入的Lambda表达式彻底改变了这一局面,它允许开发者以内联的方式定义匿名函数,大幅提升代码的简洁性和灵活性。本文将带你深入理解Lambda的核心语法、捕获机制及典型应用场景。


一、Lambda表达式基础语法

1. Lambda的组成结构

Lambda表达式的基本语法如下:

[捕获列表] (参数列表) mutable(可选) noexcept(可选) -> 返回类型 {
    // 函数体
}
  • 捕获列表(Capture List):定义Lambda如何访问外部变量。

  • 参数列表(Parameters):与普通函数的参数列表类似。

  • mutable:允许修改按值捕获的变量(默认const)。

  • 返回类型:可省略,编译器自动推导。

2. 最简单的Lambda示例
auto hello = []() { 
    std::cout << "Hello, Lambda!" << std::endl; 
};
hello(); // 输出:Hello, Lambda!
3. 带参数与返回值的Lambda
auto add = [](int a, int b) -> int { 
    return a + b; 
};
std::cout << add(3, 5); // 输出:8

二、捕获列表:值捕获 vs 引用捕获

Lambda通过捕获列表访问外部变量,避免直接使用全局变量。

1. 值捕获(拷贝)
int x = 10;
auto copyLambda = [x] { 
    std::cout << x; // x为外部变量的拷贝
};
x = 20;
copyLambda(); // 输出:10(保留捕获时的值)
2. 引用捕获(别名)
int y = 10;
auto refLambda = [&y] { 
    std::cout << y; // 直接引用外部变量
};
y = 20;
refLambda(); // 输出:20(实时更新)
3. 隐式捕获
  • [=]:以值方式捕获所有外部变量。

  • [&]:以引用方式捕获所有外部变量。

int a = 1, b = 2;
auto sum = [=] { return a + b; }; // 值捕获a和b
4. 混合捕获
int m = 5, n = 6;
auto mix = [=, &n] { 
    // m值捕获,n引用捕获
};

注意事项

  • 引用捕获需确保变量生命周期!

  • 静态变量、全局变量无需捕获。


三、Lambda的典型应用场景

1. STL算法中的灵活使用
std::vector<int> nums = {3, 1, 4, 1, 5};
// 降序排序
std::sort(nums.begin(), nums.end(), [](int a, int b) {
    return a > b;
});

// 遍历输出(C++17起支持constexpr)
std::for_each(nums.begin(), nums.end(), [](int x) {
    std::cout << x << " ";
});
2. 多线程简化线程函数
#include <thread>
std::thread t([name = "Worker"]() { // C++14初始化捕获
    std::cout << name << "线程启动!";
});
t.join();
3. 回调函数与延迟执行
void fetchData(std::function<void(std::string)> callback) {
    // 模拟异步获取数据
    callback("Data received!");
}

// 调用时传递Lambda
fetchData([](std::string result) {
    std::cout << result;
});

四、总结与注意事项

Lambda的优势:
  • 代码简洁:替代冗长的仿函数。

  • 上下文访问:通过捕获机制直接使用局部变量。

  • 灵活适配:兼容std::function、模板参数。

使用建议:
  • 避免在Lambda中长时间持有引用捕获的大对象。

  • 值捕获重要状态时,考虑使用mutable(谨慎使用)。

  • 优先使用显式捕获以提高可读性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值