【C++11 lambda函数表达式】

@TOC

Lambda函数表达式

在这里插入图片描述
对一个vector容器的数据进行排序,如果只是单单的使用标准库提供的排序进行排序是完全不够用的。比如一个游戏里的一个装备或角色的属性,有攻击力和防御力或购买价格,都有不同的大小值,如果要进行比较,就要在不同的方面进行比较。但是标准库的排序又不足以进行这方面的比较排序。
对于这种情况,我们有三种解决方案,使用函数指针,仿函数,和lambda函数表达式。

对比函数指针,仿函数,lambda函数三种情况

struct equipment {
	string _name;
	int _attack;
	int _defend;
	int _price;
	equipment(const char* name,int attack = 0,int defend = 0,int price = 0)
		:_name(name),_attack(attack),_defend(defend),_price(price)
	{}
};
bool equipmentcmp_price(const equipment& a1, const equipment& a2)
{
//使用了函数指针的方法进行比较
	return a1._defend > a2._defend;
}
struct Sort
{
	bool operator()(const equipment& a1, const equipment& a2)
	{
		return a1._price > a2._price;
	}
};
int main()
{
	vector<equipment> v{ {"剑",10,1,100},{"刀",11,3,110},{"盾牌",1,10,103} };
	vector<equipment> v1, v2, v3;
	v1 = v2 = v3 = v;
	sort(v1.begin(), v1.end(), [](equipment& e1, equipment& e2) {return e1._attack > e2._attack; });
	sort(v2.begin(), v2.end(), Sort());
	sort(v3.begin(), v3.end(),equipmentcmp_price);
	return 0;
}

对于一个equipment的对象,有4个成员变量,其中对于和排序有关的有三个成员变量。如果进行比较我们有三种课比较的方法。因为sort排序是模板,使用可以传第三个参数。(传函数指针,仿函数,lambda函数)
我们可以使用函数指针实现防御值大小比较排序,仿函数实现价格排序比较功能,但是我们如果需要用其他的属性比较,我们就需要在实现类似的函数指针或仿函数。这就会使得代码量增加。虽然这种方法也可以解决各种因素的排序。
现在我们就可以使用lambda函数表达式直接实现自己想实现的比较排序。

sort(v1.begin(), v1.end(), [](equipment& e1, equipment& e2) {return e1._attack > e2._attack; });
sort(v1.begin(), v1.end(), [](equipment& e1, equipment& e2) {return e1._price> e2._price; });
sort(v1.begin(), v1.end(), [](equipment& e1, equipment& e2) {return e1._defend > e2._defend; });

我们可以直接在函数体里面进行实现。lambda函数表达式可以在使用的位置进行定义实现,可以直接明了的知道该函数需要实现怎么样的一个功能。函数指针是地址,阻止了内联,不能直接展开,但是仿函数和lambda函数可以内联展开,提高效率。
lambda可以这样实现是得益于它的底层实现是重载了operator(),程序员表面看到的是lambda,但底层调用的是operator()重载。像仿函数一样实现。
在这里插入图片描述
在这里插入图片描述
lambda也是一个类模板,但是如果不是同一个lambda函数实现的功能,即使内部实现的原理和结果一样,调用的lambda对象都是不一样的。
在这里插入图片描述
每个lambda都有自己的通用唯一识别码UUID,可以和其他的lambda表达式进行区别。

捕捉列表

[ ]捕捉列表可以在里面写=号或&号或变量(在同一作用域中)。
捕捉列表的参数捕捉后会具有常性,不可修改,所以我们需要加上matable这个关键字。不然无法执行。或者我们捕捉列表的时候我们采取引用的方式捕捉。通过捕捉列表捕捉的参数他们的地址是一样的,所以我们可以采取matable或引用的方式对他进行修改,如果没有采取,我们只能对变量进行使用但不能修改。
在这里插入图片描述
######################################################################
在这里插入图片描述
&引用捕捉,=值捕捉
######################################################################
在这里插入图片描述
当使用=(或&引用)进行捕捉时,我们不能在对某个变量或对象进行值(或&引用)得捕捉,这会导致重复捕捉,只能=全部(或全部&捕捉)进行值捕捉,然后对某个变量或对象进行引用捕捉(或值捕捉)。类和对象可以使用this捕捉。
在这里插入图片描述

  • 25
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值