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

Lambda 表达式是为了解决啥问题,语法,使用规则,c++中的常用用法示例

2024/6/21 11:20:09

Lambda 表达式的主要目的是为了简化函数对象(或称为函数符)的创建和使用。传统的函数对象需要定义一个具名的类或者使用函数指针,而Lambda 表达式可以在需要时直接定义一个匿名函数,从而减少代码量和提高代码的可读性。

Lambda 表达式的语法
在 C++ 中,Lambda 表达式的基本语法如下:

[capture list] (parameters) -> return_type {
// Lambda 表达式的函数体
}
其中各部分的含义解释如下:

捕获列表 (capture list):指定 Lambda 表达式访问的外部变量。可以为空,或者包含捕获的变量以及捕获方式。捕获方式可以是按值捕获([=])或按引用捕获([&]),也可以指定具体的变量进行捕获([x, &y])。

参数列表 (parameters):与普通函数的参数列表类似,可以为空或包含一个或多个参数。

返回类型 (return_type):指定 Lambda 表达式的返回类型。可以显式指定,也可以使用 auto 进行类型推导。

函数体:Lambda 表达式的实际代码部分,与普通函数体的语法相同。

Lambda 表达式的使用规则
捕获外部变量:Lambda 表达式可以在定义时捕获外部作用域的变量,捕获方式包括按值、按引用或混合捕获。

参数列表:Lambda 表达式可以接受参数,参数可以有类型声明,也可以根据上下文使用 auto 进行类型推导。

返回类型:Lambda 表达式可以显式指定返回类型,也可以使用 auto 进行自动推导。

函数体:Lambda 表达式的函数体可以包含多条语句,可以访问捕获的变量和参数。

C++ 中的常用用法示例
作为 STL 算法的谓词:
cpp
std::vector numbers = {1, 2, 3, 4, 5};
// Lambda 表达式作为 std::find_if 的谓词,查找第一个偶数
auto it = std::find_if(numbers.begin(), numbers.end(), [](int n) { return n % 2 == 0; });
自定义排序准则:
cpp
std::vectorstd::string words = {“apple”, “orange”, “banana”, “grape”};
// Lambda 表达式作为 std::sort 的比较准则,按字符串长度排序
std::sort(words.begin(), words.end(), [](const std::string& a, const std::string& b) {
return a.size() < b.size();
});
多线程编程中的使用:
cpp
#include
#include

int main() {
int num = 10;
// Lambda 表达式作为线程函数,捕获外部变量 num
std::thread t(&num {
std::cout << "Thread started, num = " << num << std::endl;
});

t.join();
return 0;

}
Lambda 表达式使得代码更加紧凑、易读,并且可以方便地在需要时定义函数对象,而无需显式地创建一个命名的函数或类。

相关文章:

  • JVS开源底座与核心引擎的全方位探索,助力IT智能、高效、便捷的进化
  • ffmpeg windows系统详细教程
  • Android集成mapbox教程
  • 向量数据库选型
  • 数据加密两大政企实践案例 | 麒麟信安护航海量核心数据安全无虞
  • 搞IT需不需要考个软考中级?
  • SQL新手蜕变:掌握这20条常用SQL语句,让你也能成为高手!
  • spring 单元测试注解
  • 服务器数据恢复—OceanStor存储中NAS卷数据丢失如何恢复数据?
  • HarmonyOS Next 系列之沉浸式状态实现的多种方式(七)
  • 快消品经销商的仓库管理,有哪些是必须注意的事项?
  • RSA密码系统的特定密钥泄露攻击与Coppersmith方法的应用
  • 钒能新材料综合回收利用,钒溶液净化富集工艺之离子交换法
  • iptables(4)规则匹配条件
  • 方舟云康亏损收窄:三年近10亿销售成本,平均付费及月活仍大幅承压
  • 网络传输文件的问题
  • JavaScript HTML DOM
  • JS函数式编程 数组部分风格 ES6版
  • leetcode98. Validate Binary Search Tree
  • Lucene解析 - 基本概念
  • Mysql优化
  • PhantomJS 安装
  • PHP 7 修改了什么呢 -- 2
  • spring security oauth2 password授权模式
  • 爱情 北京女病人
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 前嗅ForeSpider中数据浏览界面介绍
  • 深入 Nginx 之配置篇
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • 一些css基础学习笔记
  • ​​​​​​​开发面试“八股文”:助力还是阻力?
  • #php的pecl工具#
  • #职场发展#其他
  • $().each和$.each的区别
  • $.ajax中的eval及dataType
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (MATLAB)第五章-矩阵运算
  • (void) (_x == _y)的作用
  • (分布式缓存)Redis哨兵
  • (附源码)php新闻发布平台 毕业设计 141646
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (七)c52学习之旅-中断
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • (转)http协议
  • (转载)PyTorch代码规范最佳实践和样式指南
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • .FileZilla的使用和主动模式被动模式介绍
  • .NET Core 将实体类转换为 SQL(ORM 映射)
  • .net framework 4.8 开发windows系统服务
  • .Net程序帮助文档制作
  • .NET中的Exception处理(C#)
  • /3GB和/USERVA开关