lambda表达式

lambda表达式

lambda语法

无返回值的lambda表达式

[](int x){std::cout << x << std::endl;}(90);

lambda表达式主要有四个部分

[]及其内部内容:
lambda表达式开头是使用[]括起来,[]及其内部的部分称为是捕获表达式。其作用为捕获本lambda表达式之外的变量,即捕获作用域在匿名函数之外的变量,若在本匿名函数中未使用外部的变量,那么此括号内为空。

在[]内部,可以有三种方式。

int x = 100, y = 99, z = 122;
//直接以值传递的为lambda表达式传入了变量
auto printx = [x, y](){return x > y ? x : y;};
std::cout << printx() << std::endl;

//以引用传递的为lambda表达式传入了变量
auto printy = [&x, &y](){return x > y ? x : y;};
std::cout << printx() << std::endl;

//以值传递的方式为lambda传入参数列表内的所有变量
auto printx1 = [=](){return x > y ? x : y;};
std::cout << print1() << std::endl;

//以引用传递方式为lambda传入参数列表内的所有变量
auto printx2 = [&](){return x > y ? x : y;};
std::cout << printx() << std::endl;

//也可以传递指针
//当为this时,则可以使用lambda所在类内的成员变量
char* ptr = new char;
auto printx = [ptr]() {cout << *ptr << endl; };

()及其内部内容:
方括号之后为(),此括号内定义的是本lambda表达式的参数列表。

{}及其内部内容:
{}内部包含lambda表达式的具体实现。

()及其内部内容:
()是在使用lambda表达式并为其传入参数,就相当于是普通函数里面的形参列表。

mutable关键字:
当使用值传递给lambda表达式的变量在lambda内部是不可修改的,若想要对其进行修改,则需添加关键字mutable。

//此时会编译失败
//报错为:表达式必须式可修改的左值,x无法在非可变lambda中修改通过捕获复制
int x = 100, y = 120;
auto test = [x, y]() {x = y; };

//添加关键字mutable即可
auto test = [x, y]() mutable {x = y; };

->返回值类型
在lambda中会存在返回值,返回值类型则使用->来限制。语法为:

[捕获变量](lambda参数列表)mutable -> 返回值类型 {函数体}(实参)
在上述语法中,部分内容可根据实际情况省略。
比如:

[](int x, int y) -> int {int z = x + y; return z;}

限定返回值类型的-> 有两种情况可以省略:

  1. 返回值为void
  2. 函数体中只有一处return的地方,此时编译器可以自动推导出返回值的类型。
    上述例子都是这样。

若想要使用lambda的表达式,可以把lambda表达式赋给一个auto类型的对象,系统会自动进行类型的推导。在进行调用时再为lambda传入参数。例如

//赋给auto类型对象
auto printX = [](int x){std::cout << x << std::endl;};
//传参并调用
printX(90);

有返回值的lambda表达式

auto compareXY = [](int x, int y){return x > y ? x : y;};
int result = compare(99, 100);
std :: cout << temp << std::endl;

匿名对象作为参数使用

//求一个数组中的最大值
int maxItem(const std::vector<int>& vec, int(*func)(int, int)){
	int max = vec[0];
	for(int item : vec){
		max = func(max, item);
	}
	return max;
}
int main(){
	auto compareXY = [](int x, int y){return x > y ? x : y;};
	std::vector<int> myVec = {32, 56, 78, 12, 45, 100};
	int result = maxItem(myvec, compareXY);
	std::cout << result << std::endl;
	return 0;
}



posted on 2022-03-20 21:23  hxh_space  阅读(105)  评论(0)    收藏  举报

导航