认识lambda

✅ 核心先记:lambda捕获规则

\] 捕获区决定外部变量的使用方式, () 参数区, {} 函数体 ✅ 值传递: \[x,y\] → 拷贝外部变量,lambda内只读(默认),修改需加 mutable ✅ 引用传递: \[\&x,\&y\] → 直接引用外部变量,lambda内修改会同步影响外部 ✅ 混合捕获: \[x,\&y\] → 部分值传、部分引用,最常用场景 📌 示例1:值传递(默认只读,拷贝外部变量) cpp #include \ using namespace std; int main() { int a = 10, b = 20; // 【值传递】捕获a、b,拷贝到lambda内部,默认只读 auto lambda_val = \[a, b\]() { // a++; ❌ 报错!值传递默认不可修改外部拷贝的变量 cout \<\< "值传递:a=" \<\< a \<\< ", b=" \<\< b \<\< endl; }; a = 100; b = 200; // 外部修改变量 lambda_val(); // 输出:10,20 ✅ 用的是捕获时的拷贝值,不受外部修改影响 return 0; } 📌 示例2:值传递+mutable(可修改内部拷贝的变量) cpp int main() { int a = 10; // 【值传递+mutable】解锁内部拷贝变量的修改权限 auto lambda_val_mu = \[a\]() mutable { a++; // ✅ 允许修改,仅改lambda内部的拷贝值 cout \<\< "mutable值传递:内部a=" \<\< a \<\< endl; }; lambda_val_mu(); // 输出:11 cout \<\< "外部a=" \<\< a \<\< endl; // 输出:10 ✅ 外部变量完全不受影响 return 0; } 📌 示例3:引用传递(直接绑定外部变量,修改同步) cpp int main() { int a = 10, b = 20; // 【引用传递】\&a、\&b 绑定外部变量,无拷贝 auto lambda_ref = \[\&a, \&b\]() { a++; b++; // ✅ 直接修改外部变量 cout \<\< "引用传递:a=" \<\< a \<\< ", b=" \<\< b \<\< endl; }; lambda_ref(); // 输出:11,21 cout \<\< "外部:a=" \<\< a \<\< ", b=" \<\< b \<\< endl; // 输出:11,21 ✅ 同步修改 return 0; } 📌 示例4:混合捕获(最常用!部分值传+部分引用) ✅ 核心场景:只读的变量用值传,需要修改的变量用引用传 cpp int main() { int fix_val = 100; // 固定值,无需修改 → 值传递 int change_val = 0; // 需要修改 → 引用传递 // 【混合捕获】fix_val值传,change_val引用传 auto lambda_mix = \[fix_val, \&change_val\](int add) { change_val += fix_val + add; // 修改引用变量,使用值传变量 cout \<\< "混合:fix=" \<\< fix_val \<\< ", change=" \<\< change_val \<\< endl; }; lambda_mix(50); // 输出:fix=100, change=150 cout \<\< "外部change=" \<\< change_val \<\< endl; // 输出:150 ✅ 同步修改 fix_val = 200; // 外部修改值传变量 lambda_mix(50); // 输出:fix=100, change=300 ✅ 值传仍用捕获时的拷贝 return 0; } 📌 补充2个快捷捕获语法(实战常用) cpp int main() { int a=10, b=20; // 1. \[=\] 所有外部变量都值传递 auto lambda_all_val = \[=\]() { cout \<\< a \<\< "," \<\< b \<\< endl; }; // 2. \[\&\] 所有外部变量都引用传递 auto lambda_all_ref = \[\&\]() { a++; b++; }; return 0; } ✅ 值传递 \[x\]:拷贝一份,lambda内独立,不影响外部,安全只读 ✅ 值传递+mutable:仅能改内部拷贝,外部不变,适合临时修改 ✅ 引用传递 \[\&x\]:共享内存,lambda内修改=外部修改,适合需回写数据 ✅ 混合捕获 \[x,\&y\]:兼顾安全+灵活,C++ lambda实战第一选择 带有返回值的lambda函数 // 使用尾置返回类型 auto lambda1 = [](int x) -> int { return x * 2; }; // 使用 decltype auto lambda2 = [](auto x) -> decltype(x * 2) { return x * 2; };

相关推荐
AI进化营-智能译站13 分钟前
ROS2 C++开发系列16-智能指针管理传感器句柄|告别ROS2节点内存泄漏与野指针
java·c++·算法·ai
报错小能手14 分钟前
好好讲讲移动构造 移动赋值
c++
syker31 分钟前
AIFerric深度学习框架:自研全栈AI基础设施的技术全景
开发语言·c++
xvhao20131 小时前
单源、多源最短路
数据结构·c++·算法·深度优先·动态规划·图论·图搜索算法
笑鸿的学习笔记2 小时前
qt-C++语法笔记之Qt Graphics View 框架中的类型辨析完全指南
c++·笔记·qt
山居秋暝LS2 小时前
安装C++版opencv和opencv_contrib
开发语言·c++·opencv
谭欣辰3 小时前
LCS(最长公共子序列)详解
开发语言·c++·算法
Cando学算法3 小时前
鸽笼原理(抽屉原理)
c++·算法·学习方法
郝学胜-神的一滴4 小时前
跨平台动态库与头文件:从原理到命名的深度解析
linux·c++·程序人生·unix·cmake
代码中介商4 小时前
C++ 仿函数(Functor)深度解析:从基础到应用
开发语言·c++