当前位置: 首页 > news >正文

C++ Lambda表达式使用

Lambda 表达式基本语法

C++ Lambda 表达式的基本结构如下:

[capture](parameters) -> return_type { body }
  • [capture]:捕获列表,指定外部变量的捕获方式(值捕获、引用捕获等)。
  • (parameters):参数列表,与普通函数参数一致(C++14 支持auto泛型参数)。
  • -> return_type:可选的返回类型声明(省略时由编译器自动推导)。
  • { body }:函数体,实现具体逻辑。

最小 Lambda 示例

auto print = [] { std::cout << "Hello, Lambda!"; }; print(); // 输出:Hello, Lambda!

捕获列表的用法

捕获列表控制 Lambda 访问外部变量的方式:

值捕获(复制变量):

int x = 10; auto lambda = [x] { return x + 1; }; // 捕获 x 的副本

引用捕获(直接操作原变量):

int y = 20; auto lambda = [&y] { y += 5; }; // 修改原变量 y lambda(); // y 变为 25

混合捕获

int a = 1, b = 2; auto lambda = [a, &b] { return a + b; }; // a 值捕获,b 引用捕获

隐式捕获

  • [=]:以值捕获所有外部变量。
  • [&]:以引用捕获所有外部变量。
  • [=, &x]:默认值捕获,仅x引用捕获。

与 STL 算法结合

Lambda 常用于简化 STL 算法的调用,例如std::sortstd::for_each

std::vector<int> nums = {3, 1, 4, 1, 5}; std::sort(nums.begin(), nums.end(), [](int a, int b) { return a > b; }); // nums 变为 {5, 4, 3, 1, 1}

生命周期与悬垂引用风险

若 Lambda 捕获引用且原始变量已销毁,后续调用会引发未定义行为:

std::function<int()> createLambda() { int z = 30; return [&z] { return z; }; // 危险:z 是局部变量 } auto f = createLambda(); f(); // 错误:z 已销毁

性能优化建议

  • 优先使用auto存储 Lambda:避免std::function的间接调用开销。
  • 无捕获 Lambda 可转换为函数指针:适用于 C 接口回调。
  • 避免过度捕获:仅捕获必要变量以减少对象大小。

高级特性(C++14/17)

泛型 Lambda(C++14):

auto adder = [](auto a, auto b) { return a + b; }; adder(3, 4.5); // 返回 7.5

初始化捕获(C++14):

int x = 10; auto lambda = [y = x + 1] { return y; }; // y 初始化为 x + 1

constexprLambda(C++17):

constexpr auto square = [](int n) { return n * n; }; static_assert(square(5) == 25); // 编译期计算


http://www.zskr.cn/news/1472848.html

相关文章:

  • 618 买电视参考热销榜单:海信全渠道量额双冠,RGB-Mini LED 成换代首选
  • MgB2参考论文
  • 五个新的游戏开发挑战
  • 鸣潮自动化终极指南:5分钟快速上手ok-ww后台自动战斗系统
  • 黄冈手表回收包包回收哪家店铺靠谱价格高?26年甄选top榜店铺排行推荐 - 莘州文化
  • 新手必看!电路设计里的‘接地’到底怎么接?单点、多点、混合接地保姆级讲解
  • 黄南手表回收包包回收哪家店铺靠谱价格高?26年甄选top榜店铺排行推荐 - 莘州文化
  • 大众点评数据采集实战指南:五分钟破解反爬难题的完整方案
  • 3个步骤:手机端免Root提取Android系统镜像的终极方案
  • Sketch MeaXure:从设计标注到规范生成的企业级技术实现与工作流优化
  • Fragment 全解
  • Codeforces胡萝卜插件:3分钟掌握实时评级预测的终极指南
  • 10-Multi-Agent 实战:PM+架构师+开发+审查
  • 别再为版本头疼!手把手教你让Carsim 2020.0 Pro与任意版本MATLAB(如R2015a/R2016b)成功联调
  • 双时钟FIFO实现跨时钟域数据安全传输
  • 济南奢侈品回收指南:新手小白必看,添价收资质齐全办事高效 - 薛定谔的梨花猫
  • 生产级机器学习系统四大支柱:可观测性、弹性、可验证性与可治理性
  • 2026最新诚信优选东营主城东城西城新区开发区黄金回收白银回收铂金回收彩金回收靠谱门店TOP6排行榜加联系方式推荐 - 余生黄金回收
  • 大同手表回收包包回收哪家店铺靠谱价格高?26年甄选top榜店铺排行推荐 - 莘州文化
  • 海南陵楠贸易:陵水县工地二手材料回收公司 - LYL仔仔
  • Mythos:首个可工程化漏洞挖掘流水线的AI安全范式
  • 【慕伏白】Codex 使用建议
  • 微信单向好友检测终极指南:3步找出谁删了你
  • 固原手表回收包包回收哪家店铺靠谱价格高?26年甄选top榜店铺排行推荐 - 莘州文化
  • 美股指南:大陆投资者合规避坑实战全深度解析版
  • AMAT 0190-81237机器人控制器
  • 哈尔滨手表回收包包回收哪家店铺靠谱价格高?26年甄选top榜店铺排行推荐 - 莘州文化
  • 安全教育体感设备赋能实训教学,筑牢多行业安全生产防线 - 资讯焦点
  • 3分钟上手WebPlotDigitizer:从图表图像智能提取数据的终极指南
  • 沧州手表回收包包回收哪家店铺靠谱价格高?26年甄选top榜店铺排行推荐 - 莘州文化