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

Android常用C++特性之lambda表达式

声明:本文内容生成自ChatGPT,目的是为方便大家了解学习作为引用到作者的其他文章中。

C++ 中的 lambda 表达式 是一种简洁的语法,用于定义 匿名函数,即无需为函数命名的函数。它允许你在函数体内定义和使用临时的可调用对象,非常适合用于回调、简化算法操作和避免定义冗长的小函数。

Lambda 表达式的语法

[capture](parameters) -> return_type {// function body
}
各部分的解释:
  • capture:捕获列表,用于捕获作用域中的变量。
  • parameters:参数列表,类似于普通函数的参数。
  • return_type:返回类型(可选)。可以自动推导,也可以显式指定。
  • function body:函数体,表示 lambda 表达式的具体执行逻辑。

示例

1. 最简单的 lambda
#include <iostream>int main() {auto greet = []() { std::cout << "Hello, World!" << std::endl; };greet(); // 调用 lambdareturn 0;
}
2. 带参数的 lambda
#include <iostream>int main() {auto add = [](int a, int b) { return a + b; };std::cout << "Sum: " << add(3, 4) << std::endl; // 输出: Sum: 7return 0;
}
3. 带捕获列表的 lambda

捕获列表用于捕获外部作用域中的变量。你可以通过值或引用来捕获变量。

  • 按值捕获:捕获的变量的副本。
  • 按引用捕获:捕获变量的引用,允许修改。
#include <iostream>int main() {int x = 10;int y = 20;// 按值捕获 x,按引用捕获 yauto lambda = [x, &y]() {std::cout << "x: " << x << ", y: " << y << std::endl;// y 可以修改,x 是捕获的副本,不能修改y += 10;};lambda(); // 输出: x: 10, y: 20std::cout << "y after lambda: " << y << std::endl; // 输出: y after lambda: 30return 0;
}
4. 捕获所有变量
  • 使用 [=] 捕获外部作用域中的所有变量 按值 传递。
  • 使用 [&] 捕获外部作用域中的所有变量 按引用 传递。
#include <iostream>int main() {int a = 5, b = 10;// 按值捕获所有变量auto lambda_by_value = [=]() {std::cout << "a: " << a << ", b: " << b << std::endl;};// 按引用捕获所有变量auto lambda_by_ref = [&]() {a += 10;b += 20;};lambda_by_value(); // 输出: a: 5, b: 10lambda_by_ref();   // 修改外部变量std::cout << "a: " << a << ", b: " << b << std::endl; // 输出: a: 15, b: 30return 0;
}
5. 指定返回类型

如果 lambda 表达式的返回类型不能自动推导,或者返回类型是复杂的类型,可以显式指定返回类型。

#include <iostream>int main() {auto divide = [](int a, int b) -> double {return static_cast<double>(a) / b;};std::cout << "Result: " << divide(10, 3) << std::endl; // 输出: Result: 3.33333return 0;
}

常见用途

1. 与标准库算法配合使用

Lambda 表达式常用于标准库的算法中,如 std::for_each, std::sort, std::transform 等。

#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> vec = {5, 2, 9, 1, 5, 6};// 使用 lambda 表达式进行排序std::sort(vec.begin(), vec.end(), [](int a, int b) {return a < b;});// 使用 lambda 表达式遍历并输出std::for_each(vec.begin(), vec.end(), [](int n) {std::cout << n << " ";});std::cout << std::endl;return 0;
}
2. 捕获外部变量并用于回调函数

Lambda 表达式适合在事件驱动或回调场景中使用。

#include <iostream>
#include <functional>void performTask(std::function<void()> task) {task();
}int main() {int counter = 0;performTask([&counter]() {counter += 1;std::cout << "Counter: " << counter << std::endl;});return 0;
}

总结

  • 捕获方式:通过捕获列表 [ ] 指定捕获外部变量的方式。
  • 简洁性:可以用 lambda 表达式代替简单的函数或函数对象,简化代码。
  • 应用场景:适合临时、匿名的可调用对象,特别是在回调、算法、事件处理中广泛应用。

相关文章:

  • 2-107 基于matlab的hsv空间双边滤波去雾图像增强算法
  • Linux 简易shell编写
  • ResNet18果蔬图像识别分类
  • Git提示信息 Pulling is not possible because you have unmerged files.
  • 线段树查询区间回文+区间字母右移
  • Python NumPy 标准数据生成:高效创建与操作数组
  • SQL Server实现limit用法
  • 初识chatgpt
  • cnn机器学习时python版本不兼容报错
  • Android 10.0 Launcher3禁止改变density等系统密度导致布局变化hotseat靠右边显示功能实现
  • 查询最近正在执行的sql(DM8 : 达梦数据库)
  • Electron 隐藏顶部菜单
  • Docker的安装和使用
  • 一文详解大语言模型Transformer结构
  • LangGPT结构化提示词编写实践
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • 【391天】每日项目总结系列128(2018.03.03)
  • ➹使用webpack配置多页面应用(MPA)
  • CentOS 7 修改主机名
  • GitUp, 你不可错过的秀外慧中的git工具
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • Mocha测试初探
  • SpiderData 2019年2月13日 DApp数据排行榜
  • uni-app项目数字滚动
  • 闭包--闭包之tab栏切换(四)
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 实战|智能家居行业移动应用性能分析
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 新版博客前端前瞻
  • 学习ES6 变量的解构赋值
  • 因为阿里,他们成了“杭漂”
  • 用Python写一份独特的元宵节祝福
  • Spring Batch JSON 支持
  • ​如何防止网络攻击?
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • #if等命令的学习
  • (windows2012共享文件夹和防火墙设置
  • (笔记自用)LeetCode:快乐数
  • (离散数学)逻辑连接词
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • 、写入Shellcode到注册表上线
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .net 8 发布了,试下微软最近强推的MAUI
  • .NET C# 使用GDAL读取FileGDB要素类
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
  • .net6 当连接用户的shell断掉后,dotnet会自动关闭,达不到长期运行的效果。.NET 进程守护
  • .net程序集学习心得
  • .NET设计模式(2):单件模式(Singleton Pattern)
  • /usr/bin/python: can't decompress data; zlib not available 的异常处理
  • @manytomany 保存后数据被删除_[Windows] 数据恢复软件RStudio v8.14.179675 便携特别版...
  • @property @synthesize @dynamic 及相关属性作用探究