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

C++ lambda表达式

1、Lambda 表达式和匿名函数的区别:匿名函数是一个广泛的概念,用于描述没有名字的函数,Lambda 表达式是一种特定的匿名函数实现。在许多编程语言中,Lambda 表达式可以捕获外部变量的上下文(即闭包),而传统的匿名函数则不总是具备这种能力。

2、Lambda 表达式的主要作用:Lambda表达式使得可以在需要函数作为参数的情况下,快速定义函数,而不需要事先声明一个函数。

3、Lambda 表达式的基本语法

[capture](parameters) -> return_type {
    // function body
}

capture:指定外部变量的捕获方式(如按值或按引用)。
parameters:参数列表,与普通函数类似。
return_type:返回类型(可以省略,编译器会推导)。
function body:函数体。

4、示例1:在需要函数作为参数的情况下,快速定义函数,而不需要事先声明一个函数:

bool test(int(*fp)())// test函数需要一个函数作为参数,fp为函数指针
{
	return fp() > 10;
}

int main()
{
	bool flag = test([](){// 给test函数一个 lambda 表达式
		return 5;
		});

	cout << "flag == " << flag << endl;// flag == 0

	return 0;
}

示例2:Lambda 表达式可以在普通函数中定义和使用,但是普通函数不能在函数中定义:

int main()
{
	auto greet = [](const string& name)
	{
		cout << "hello " + name << endl;
	};

	greet("tom");// hello tom

	return 0;
}

示例3:Lambda 表达式可以捕获外部变量。[ ]就是捕获列表,所谓捕获列表,其实可以理解为参数的一种类型,Lambda 表达式内部函数体在默认情况下是不能够使用函数体外部的变量的, 这时候捕获列表可以起到传递外部数据的作用:

int main()
{
	// 定义两个外部变量
	int x = 10;
	int y = 20;

	// 方式一:按值捕获外部变量
	auto add = [x, y]()
	{
		//x = 100; 报错,此时无法修改按值捕获的外部变量
		return x + y;
	};
	cout << add() << endl;// 30


	// 方式二:按引用捕获外部变量
	auto sub = [&x, &y]()
	{
		x = 100;// 可以修改按引用捕获的外部变量
		return x - y;
	};

	cout << sub() << endl;// 80
	cout << "x == " << x << endl;// x == 100,外部变量 x 也被修改
	
	return 0;
}

5、隐式捕获(自动捕获周围作用域中的变量),手动书写捕获列表有时候是非常复杂的,这种机械性的工作可以交给编译器来处理,这时候可以在捕获列表中写一个 & 或 = ,向编译器声明采用引用捕获或者值捕获,让编译器自行推导引用列表:

int main()
{
	// 定义两个外部变量
	int x = 10;
	int y = 20;

	// 方式一:按值捕获两个外部变量
	auto add = [=]()
	{
		//x = 100; 报错,此时无法修改按值捕获的外部变量
		return x + y;
	};
	cout << add() << endl;// 30

	// 方式二:按引用捕获两个外部变量
	auto sub = [&]()
	{
		x = 100;// 可以修改按引用捕获的外部变量
		return x - y;
	};
	cout << sub() << endl;// 80

	return 0;
}

6、值得注意的是,如果不使用按引用捕获外部变量的方式,但也想修改外部变量,可以使用 mutable 关键字,但是外部变量本身没有被修改

int main()
{
	// 定义两个外部变量
	int x = 10;
	int y = 20;

	// 方式一:按值捕获外部变量
	auto add = [x, y]() mutable {
		x = 100;// 可以修改按值捕获的外部变量
		return x + y;
	};
	cout << add() << endl;// 120
	cout << "x == " << x << endl;// x == 10,外部变量 x 本身没有被修改
	
	return 0;
}

文章转载自:

http://FrKSudRn.fbpdp.cn
http://MefeHBX6.fbpdp.cn
http://HQkqcR6W.fbpdp.cn
http://sAOy4drD.fbpdp.cn
http://bDOo0ef4.fbpdp.cn
http://Se6ERcrn.fbpdp.cn
http://o3qDcOkO.fbpdp.cn
http://XCQCrd89.fbpdp.cn
http://UhR9jxyE.fbpdp.cn
http://UR04GxcK.fbpdp.cn
http://VEaPeLfk.fbpdp.cn
http://uRA0aDEh.fbpdp.cn
http://lWmHglTI.fbpdp.cn
http://3SG0QQwS.fbpdp.cn
http://ReXgXp2J.fbpdp.cn
http://zK8x1EXV.fbpdp.cn
http://vamKGugO.fbpdp.cn
http://Akh6oqYM.fbpdp.cn
http://z3Z6isdF.fbpdp.cn
http://XSnzXFfE.fbpdp.cn
http://MzjTL9RR.fbpdp.cn
http://36qQm4pt.fbpdp.cn
http://EOsXYzxY.fbpdp.cn
http://Y4L2wZhR.fbpdp.cn
http://MIzEuntE.fbpdp.cn
http://jWtvOXYo.fbpdp.cn
http://uAtnwrxv.fbpdp.cn
http://2KRrY0dy.fbpdp.cn
http://8WgM9T91.fbpdp.cn
http://Vwrtpmd3.fbpdp.cn
http://www.dtcms.com/a/36143.html

相关文章:

  • DeepSeek 15天指导手册——从入门到精通 PDF(附下载)
  • 机器学习基础入门——机器学习库介绍(NumPy、pandas、Matplotlib)
  • C/C++后端开发面试表述、技术点摸底——基础组件篇
  • VM C#脚本 调用命令行 以python为例
  • Python在大数据AI领域的优势分析【为什么使用Python开发】
  • git设置本地代理
  • 基于深度学习的SSD口罩识别项目完整资料版(视频教程+课件+源码+数据)
  • 矩阵乘积态简介
  • 设备能够连接WiFi,能ping通百度,但是网页无法打开显示没有网络
  • 力扣leetcode 21. 合并两个有序链表 递归 C语言解法
  • 如何生成traceid以及可视化展示
  • 【Java毕业设计】商城购物系统(附源码+数据库脚本)
  • Directed acyclic graph [DAG]有向无环图 应用场景汇总与知名开源库实现细节说明
  • Junit+Mock
  • Tag标签的使用
  • 一篇文章学懂Vuex
  • 汽车4S行业的信息化特点与BI建设挑战
  • Docker 的安全配置与优化(一)
  • deepseek 导出导入模型(docker)
  • GO 进行编译时插桩,实现零码注入
  • 数据库系统架构与DBMS功能探微:现代信息时代数据管理的关键
  • Unity制作游戏项目——Unity项目如何导出安装包(Inno Setup Compiler的使用)——附有Inno Setup Compiler软件安装包
  • 利用开源AI智能名片2+1链动模式S2B2C商城小程序构建企业私域流量池的策略与实践
  • 尚硅谷爬虫note010
  • PostgreSQL:更新字段慢
  • 在线骑行|基于SpringBoot的在线骑行网站设计与实现(源码+数据库+文档)
  • Vue03
  • 20250223下载并制作RTX2080Ti显卡的显存的测试工具mats
  • Java数据结构第十三期:走进二叉树的奇妙世界(二)
  • git branch