auto / 范围 for / lambda:现代简洁写法

类型交给编译器、遍历交给范围、逻辑交给捕获

商用

◎学完你会

1三种现代写法,一步到位

auto 让类型交给编译器;范围 for 遍历容器;lambda 用一个匿名函数就地写逻辑。

auto:auto n = 42; 推导出 int
范围 for:for (auto x : v) 遍历
lambda:[cap](args){ body }
看三种写法配合的结果。

2关键命令

写法含义
auto n = 42;类型由编译器从初值推导(这里是 int)
for (auto x : v)范围 for:逐个取 v 的元素(复制);auto& 取引用
auto f = [x](int a){ return a+x; };lambda:捕获 x 按值,接收 a,返回 a+x
[&] / [=]捕获列表:按引用 / 按值捕获所有外部变量
✅ auto&(或 const auto&)遍历容器可避免拷贝;lambda 的 [] 不捕获任何外部变量,[x] 只捕获 x。

3泛型 lambda:参数也用 auto

C++14 起 lambda 参数可写 auto,像模板一样适配任意类型(呼应 30.1 函数模板)。

auto twice = [](auto x){ return x * 2; }; twice(3); // 6(int) twice(2.5); // 5.0(double) // 传 string 就报错:string 不支持 * 2,实例化处才暴露(同模板行为)
注意:lambda 是"局部的匿名函数对象"。捕获 [x] 按值(拷贝快照)、[&x] 按引用(改原变量);按引用捕获要当心 lambda 生命周期超过变量会悬空。

!易错点

① auto 丢 const/引用——for (auto x : v) 是复制,改 x 不影响 v;要改原元素用 auto&。
② lambda 捕获 [&] 后生命周期悬空——lambda 存起来用时,捕获的局部变量可能已销毁。
③ 忘写返回类型导致类型混乱——lambda 返回 auto 推导,逻辑里有歧义会报错。
④ 范围 for 里改容器——遍历时 push_back / erase 会让迭代器失效,行为未定义。

?跨学科:auto/范围 for/lambda,像"交给工具省心"

auto 像"让系统自动补全类型",你只管给值;范围 for 像"扫一眼整个清单",不用手动数第几个;lambda 像"当场写张小纸条"即用即走,不用专门开个文件。

它们共同点是减少重复、降低出错面:把类型推导、遍历、临时逻辑都交给工具/编译器,代码更聚焦"想做什么"而非"怎么写"。这也是现代 C++ 倡导"表达意图,少写机械细节"的体现。

✎练一练

auto n = 42; 中 auto 的作用是?
auto 由编译器根据初值推导类型,auto n=42; 的 n 是 int。
用范围 for for (auto x : v) 遍历 v,x 是?
for (auto x : v) 的 x 是元素副本;要修改原元素须用 auto&。
lambda [x](int a){ return a+x; } 中 [x] 的作用是?
[x] 是捕获列表:按值把外部变量 x 拷进 lambda。要引用则写 [&x]。