C++ Lambda表达式简明指南:新手快速上手

前言

整理了一下C++中的Lambda表达式的用法。

内容对新手比较友好

一、什么是Lambda?

Lambda是C++11引入的匿名函数 ,用于快速定义临时使用的简单函数,特别适合配合sortfor_each等场景。

基础格式

cpp 复制代码
auto 变量名 = [捕获列表](参数列表) { 函数体 };

最简示例

cpp 复制代码
auto sayHello = []() { 
    cout << "Hello World!"; 
};
sayHello(); // 输出Hello World!

二、快速入门三步走

1. 无参数的Lambda

cpp 复制代码
// 定义
auto printStar = []() {
    cout << "*****" << endl;
};

// 调用
printStar(); // 输出*****

2. 带参数的Lambda

cpp 复制代码
// 比较两个数的大小
auto isBigger = [](int a, int b) {
    return a > b;
};

cout << isBigger(5, 3); // 输出1 (true)

3. 使用外部变量(捕获列表)

cpp 复制代码
int score = 85;

// 捕获外部变量判断是否及格
auto checkPass = [score]() { // [ ] 内写要捕获的变量
    return score >= 60;
};

cout << checkPass(); // 输出1

三、捕获列表的两种方式

1. 值捕获(复制值)

cpp 复制代码
int x = 10;

auto copyX = [x]() { // 复制x的值
    cout << x;       // 输出10(原x的副本)
};

x = 20;              // 修改原变量
copyX();             // 仍然输出10

2. 引用捕获(操作原变量)

cpp 复制代码
int y = 5;

auto changeY = [&y]() { // 使用引用
    y += 10;
};

changeY();
cout << y; // 输出15(原变量被修改)

四、修改捕获的值(mutable关键字)

值捕获的变量默认不可修改,添加mutable解除限制:

cpp 复制代码
int count = 0;

auto counter = [count]() mutable { // 允许修改副本
    count++;
    cout << count << " ";
};

counter(); // 输出1(副本被修改)
counter(); // 输出2
cout << count; // 原变量仍为0

五、返回类型自动推导

大多数情况无需指定返回类型,编译器自动推导:

cpp 复制代码
// 自动推导为int
auto add = [](int a, int b) { 
    return a + b; 
};

// 自动推导为double
auto divide = [](double a, double b) {
    return a / b;
};

特殊场景:多分支需显式声明返回类型

cpp 复制代码
auto checkSign = [](int num) -> string { // 显式指定返回string
    if(num > 0) return "正数";
    else return "非正数";
};

六、新手常见错误

1. 引用捕获局部变量

cpp 复制代码
auto createBug() {
    int temp = 42;
    return [&temp]() { return temp; }; // temp即将销毁
} // ❌ 危险!temp已被释放

auto func = createBug();
cout << func(); // 随机值(未定义行为)

解决方案:改用值捕获或延长变量生命周期

2. 忘记mutable

cpp 复制代码
int a = 5;
auto lambda = [a]() { 
    a++; // ❌ 编译错误!
};

解决方案 :添加mutable

cpp 复制代码
auto lambda = [a]() mutable { 
    a++; // ✅ 
};
相关推荐
云边有个稻草人1 小时前
思维与算法共舞:AIGC语言模型的艺术与科学
开发语言·算法·什么是语言模型?·多任务学习与多模态生成·客户服务与聊天机器人·自适应生成与定制化文本·预训练与微调
政安晨1 小时前
【嵌入式人工智能产品开发实战】(二十)—— 政安晨:小智AI嵌入式终端代码解读:【B】小智AI嵌入式终端OTA升级功能深度解析
c++·人工智能·嵌入式·ota·小智ai·代码解读·ai聊天助手
pzx_0011 小时前
【深度学习】自定义实现DataSet和DataLoader
开发语言·人工智能·python·深度学习·算法
HelloRevit5 小时前
Next.js 快速启动模板
开发语言·javascript·ecmascript
a东方青7 小时前
[16届蓝桥杯 2025 c++省 B] 移动距离
c++·算法·蓝桥杯
春生野草8 小时前
0413-多态、Object类方法、访问权限修饰符、装箱拆箱、128陷阱
java·开发语言
烁3478 小时前
每日一题(小白)暴力娱乐篇26
java·开发语言·算法·娱乐
周周记笔记8 小时前
探索R语言:在线学习资源汇总
开发语言·r语言
zuoming1208 小时前
c# 系列pdf转图片 各种处理3--net3.1到net8 PDFtoImage
开发语言·pdf·c#
FreeLikeTheWind.8 小时前
Qt问题之 告别软件因系统默认中文输入法导致错误退出的烦恼
开发语言·c++·windows·经验分享·qt