C++ lambda 表达式详细介绍

lambda 是 C++11 核心特性,本质是匿名临时函数------ 没有函数名、专门用于写简短、一次性的逻辑(比如 STL 算法的比较规则、回调函数),不用单独定义全局 / 类成员函数,代码极简。

1.完整语法

这是 lambda 的完整写法,日常用可以省略很多部分:

cpp 复制代码
[捕获列表] (参数列表) mutable -> 返回值类型 { 函数体 };
部分 作用(通俗版) 必选 / 可选
[捕获列表] 核心 :决定能不能访问外部变量,怎么访问 ✅ 必选
(参数列表) 和普通函数一样,写入参(如 int a, int b ⭕ 可选
mutable 允许修改值捕获的外部变量(默认值捕获是只读) ⭕ 可选
-> 返回值类型 指定函数返回值(编译器会自动推导,90% 场景不用写) ⭕ 可选
{ 函数体 } 写具体逻辑代码 ✅ 必选

2.基础示例

示例 1:最简 lambda(无参、无返回、无捕获)

没有参数,没有返回值,不访问任何外部变量,直接执行逻辑。

cpp 复制代码
#include <iostream>
using namespace std;

int main() {
    // 最简lambda:[] 无捕获,() 无参,{} 函数体
    []() {
        cout << "Hello Lambda!" << endl;
    }; // 这只是定义,不会执行

    // 加 () 直接调用
    []() {
        cout << "Hello Lambda! 我执行了" << endl;
    }(); 

    return 0;
}

输出:

cpp 复制代码
Hello Lambda! 我执行了

示例 2:带参数 + 带返回值

和普通函数一样传参、返回值,编译器自动推导返回值,不用写 ->。

cpp 复制代码
int main() {
    // 功能:计算两个数的和
    auto add = [](int a, int b) {
        return a + b; // 自动推导返回值为int
    };

    // 调用lambda
    cout << "1+2=" << add(1,2) << endl; 
    return 0;
}

输出:1+2=3

3.核心:捕获列表 \[\]

lambda 默认不能直接用外部变量,必须通过 捕获列表 授权,这是 lambda 的灵魂。

4 种最常用捕获方式:

写法 含义 特点
[] 不捕获任何外部变量 纯独立函数
[=] 值捕获:拷贝所有外部变量(只读) 不修改原变量,安全
[&] 引用捕获:直接用所有外部变量(可改) 会修改原变量
[a, &b] 定制捕获:a 值拷贝,b 引用 精准控制,推荐

示例 3:值捕获 = / 变量

✅ 拷贝一份外部变量,原变量不会被修改(只读)

cpp 复制代码
int main() {
    int x = 10;
    // [x]:只捕获x;[=]:捕获所有外部变量
    auto func = [x]() {
        // x = 20; ❌ 报错:值捕获默认只读
        cout << "捕获的x:" << x << endl;
    };

    func();
    cout << "原x:" << x << endl; // 原变量不变
    return 0;
}

输出:

cpp 复制代码
捕获的x:10
原x:10

示例 4:引用捕获 \&

✅ 直接使用外部变量的地址,修改会影响原变量

cpp 复制代码
int main() {
    int x = 10;
    // [&]:引用捕获所有外部变量
    auto func = [&]() {
        x = 20; // ✅ 可修改
        cout << "修改后的x:" << x << endl;
    };

    func();
    cout << "原x:" << x << endl; // 原变量被修改
    return 0;
}

输出:

cpp 复制代码
修改后的x:20
原x:20

示例 5:mutable 关键字

作用:允许修改 值捕获 的变量(仅修改拷贝的副本,原变量不变)

cpp 复制代码
int main() {
    int x = 10;
    // 加mutable:值捕获的变量可修改
    auto func = [x]() mutable {
        x = 20; // ✅ 允许修改
        cout << "lambda内x:" << x << endl;
    };

    func();
    cout << "原x:" << x << endl; // 原变量依旧是10
    return 0;
}

输出:

cpp 复制代码
lambda内x:20
原x:10

4.实战场景(lambda 最常用的地方)

lambda 90% 用于 STL 算法(排序、查找、遍历),替代繁琐的全局函数 / 函数对象。

示例 6:结合 sort 自定义排序规则

对数组 /vector 降序排序(不用写单独的比较函数)

cpp 复制代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    vector<int> v = {3,1,4,2,5};

    // lambda 作为sort的比较函数
    sort(v.begin(), v.end(), [](int a, int b) {
        return a > b; // 降序:前一个数 > 后一个数
    });

    // 遍历:范围for + lambda
    for (int num : v) cout << num << " ";
    return 0;
}

输出:5 4 3 2 1

示例 7:结合 find_if 查找元素

查找第一个大于 3 的数字:

cpp 复制代码
int main() {
    vector<int> v = {1,2,4,3,5};
    // find_if:遍历容器,返回第一个满足条件的迭代器
    auto it = find_if(v.begin(), v.end(), [](int x) {
        return x > 3; // 查找条件
    });

    if (it != v.end()) cout << "找到:" << *it << endl;
    return 0;
}

输出:找到:4

示例 8:类中使用 lambda(捕获 this)

在类的成员函数里,用 lambda 访问成员变量,必须捕获 this。

cpp 复制代码
#include <iostream>
using namespace std;

class Test {
private:
    int val = 100;
public:
    void show() {
        // [this]:捕获当前类对象,访问成员变量/函数
        [this]() {
            cout << "类成员变量:" << val << endl;
        }();
    }
};

int main() {
    Test t;
    t.show();
    return 0;
}

输出:类成员变量:100

5.核心总结

本质:匿名临时函数,专门写简短、一次性逻辑
核心:捕获列表
\[\]:不捕获
=:值捕获(只读,拷贝)
\&:引用捕获(可改原变量)
this:类中捕获成员变量
关键字:mutable → 允许修改值捕获的变量
最佳场景:STL 算法(sort、find_if、for_each)
简化:参数、返回值都可以省略,编译器自动推导

谢谢

相关推荐
艾莉丝努力练剑1 小时前
【QT】界面优化:QSS
linux·运维·开发语言·网络·qt·计算机网络·udp
jieyucx1 小时前
站在云原生高并发天花板:拆解 Go 语言 GMP 模型与 I/O 多路复用的神级配合
开发语言·云原生·golang
caimouse1 小时前
Reactos 第 3 章 内存管理 — 【下篇】换出、Section、池
c语言·开发语言·windows·架构
无忧.芙桃1 小时前
debug实例与分析(一)
开发语言·c++·算法
zmzb01031 小时前
Python课后习题训练记录Day124
开发语言·python
geovindu1 小时前
python: Broadcast Pattern
开发语言·python·设计模式·广播模式
alwaysrun1 小时前
C++之类型安全格式化format
c++·程序员·编程语言
吴阿福|一人公司1 小时前
类变量和实例变量的命名规范有哪些具体的例子?
java·开发语言
邪修king1 小时前
C++ 哈希表超全详解:从底层实现到封装 myunordered_map/myunordered_set
c++·哈希算法·散列表