C++Lambda表达式

C++Lambda表达式

定义

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

部分 说明 是否可选
[capture] 捕获列表:指定如何访问外部变量 ❌ 必需(可为空 []
(parameters) 参数列表(类似函数) ✅ 可省略(无参时)
-> return_type 返回类型(通常可自动推导) ✅ 可省略
{ body } 函数体 ❌ 必需
cpp 复制代码
#include <iostream>
#include <string>
using namespace std;


int main()
{
	int a = 10, b = 20;

	// 外部变量用不着,但是也需要写[]
	// auto func1 = [](int x, int y) -> int { return x + y; };
	auto func1 = [](int x, int y) { return x + y; };
	int c = func1(a, b);
	cout << "result=" << c << endl;

	// 参数列表用不着,可以省略()
	// auto func2 = []() -> string { return "hello world"; };
	auto func2 = [] { return "hello world"; };
	cout << "result=" << func2() << endl;
}

捕获列表

捕获列表决定 Lambda 如何访问外部作用域的变量

1、按值捕获

好处就是外面修改了,里面的值不会变

cpp 复制代码
int main()
{
	int a = 10;
	auto func1 = [a]() {
		cout << "内部a=" << a << endl;
		// 不可修改,编译不过
		 // a = 100;
		};

	// 外部修改
	a = 100;
	func1();
	cout << "外部a=" << a << endl;
}

2、按引用捕获

传引用,内部、外部都可以修改,一变全变

cpp 复制代码
int main()
{
	int a = 10;
	auto func1 = [&a]() {
		cout << "内部修改前a=" << a << endl;
		// 内部修改
		a = 100;
		cout << "内部修改后a=" << a << endl;
		};

	// 外部修改
	//a = 100;
	func1();
	cout << "外部a=" << a << endl;
}

3、隐式捕获

  • [=]默认按值捕获所有用到的外部变量
  • [&]默认按引用捕获 所有用到的外部变量
    好处就是不用一个一个写参数了,默认全部参数一起带过去

按值所有

cpp 复制代码
int main()
{
	int a = 10, b = 20;
	auto func1 = [=]() {
		cout << "内部a=" << a << " ,b=" << b << endl;
		};

	// 外部修改
	a = 100;
	func1();
	cout << "外部a=" << a << " ,b=" << b << endl;
}

按引用所有

cpp 复制代码
int main()
{
	int a = 10, b = 20;
	auto func1 = [&]() {
		cout << "before内部a=" << a << " ,b=" << b << endl;
		b = 200;
		cout << "after内部a=" << a << " ,b=" << b << endl;
		};

	// 外部修改
	a = 100;
	func1();
	cout << "外部a=" << a << " ,b=" << b << endl;
}

4、混合捕获

  • [=, x] 不能在默认按值后显式按值捕获
  • [&, &x] 不能在默认按引用后显式按引用捕获
cpp 复制代码
int main()
{
	int a = 10, b = 20;
	auto func1 = [a, &b]() {
		cout << "before内部a=" << a << " ,b=" << b << endl;
		b = 200;
		cout << "after内部a=" << a << " ,b=" << b << endl;
		};

	// 外部修改
	a = 100;
	func1();
	cout << "外部a=" << a << " ,b=" << b << endl;
}
相关推荐
Echo缘8 分钟前
关于在.cpp文件中包含c的头文件,编译报错问题
c语言·开发语言
人道领域12 分钟前
【零基础学java】(反射)
java·开发语言
小O的算法实验室12 分钟前
2024年IEEE TITS SCI2区TOP,考虑无人机能耗与时间窗的卡车–无人机协同路径规划,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
派森先生13 分钟前
排序算法-选择排序
算法·排序算法
C雨后彩虹17 分钟前
书籍叠放问题
java·数据结构·算法·华为·面试
ghie909020 分钟前
GPS抗干扰算法MATLAB实现
开发语言·算法·matlab
格林威23 分钟前
基于轮廓特征的工件分类识别:实现无模板快速分拣的 8 个核心算法,附 OpenCV+Halcon 实战代码!
人工智能·数码相机·opencv·算法·目标跟踪·分类·数据挖掘
Jasmine_llq24 分钟前
《UVA11181 条件概率 Probability|Given》
数据结构·算法·深度优先搜索(dfs)·剪枝(可行性剪枝)·组合枚举(递归暴力枚举)·条件概率统计与归一化
ytttr87328 分钟前
基于MATLAB解决车辆路径问题(VRP)
开发语言·matlab
沛沛老爹29 分钟前
Web开发者突围AI战场:Agent Skills元工具性能优化实战指南——像优化Spring Boot一样提升AI吞吐量
java·开发语言·人工智能·spring boot·性能优化·架构·企业开发