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"