Z
ZHANK
现代 C++

Lambda 表达式

lambda 语法、捕获列表 [=] [&]、泛型 lambda、闭包

Lambda 表达式

Lambda 让函数可以在使用时现场定义——配合 STL 算法,代码从十几行变成一行。

学完本章你将: 掌握 lambda 语法、捕获列表 [=] [&]、泛型 lambda。


基本语法

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

int main() {
    // 基本形式:[捕获](参数) -> 返回类型 { 函数体 }
    auto add = [](int a, int b) -> int { return a + b; };
    std::cout << add(3, 5) << "\n";  // 8

    // 返回类型可省略(自动推导)
    auto mul = [](int a, int b) { return a * b; };

    return 0;
}

捕获列表

cpp
int x = 10, y = 20;

// [=] 按值捕获所有外部变量(只读副本)
auto f1 = [=]() { return x + y; };

// [&] 按引用捕获所有外部变量(可修改)
auto f2 = [&]() { x = 100; y = 200; };

// 混合捕获
auto f3 = [x, &y]() { return x + y; };  // x 值,y 引用

// mutable: 允许修改值捕获的副本
auto f4 = [x]() mutable { x++; return x; };

Lambda 实战

cpp
std::vector<int> v = {3, 1, 4, 1, 5, 9, 2, 6};

// 自定义排序
std::sort(v.begin(), v.end(), [](int a, int b) {
    return a % 10 < b % 10;  // 按个位排序
});

// 条件查找
auto it = std::find_if(v.begin(), v.end(),
    [](int x) { return x > 5; });

// 条件计数
int evenCount = std::count_if(v.begin(), v.end(),
    [](int x) { return x % 2 == 0; });

泛型 Lambda(C++14)

cpp
// auto 参数 → 泛型 lambda
auto twice = [](auto x) { return x * 2; };

twice(5);           // 10
twice(3.14);        // 6.28
twice(std::string("Hi"));  // "HiHi"