【C++11】lambda 表达式

函数指针,仿函数,lambda 表达式的异同:

函数指针:类型定义难以理解

例如:
bool greater_func1(int l, int r)
{
return l > r;
}
bool(*f1)(int ,int )=greater_func1;
cout << f1(1, 2) << endl;

仿函数(C++98):先定义好再用,运算符重载

例如:
struct greater_func2
{
bool operator()(int l, int r)
{
return l > r;
}
};
greater_func2 f2;
cout<<f2(1,2)<<endl;

lambda 表达式:要用就原地定义

例如:
auto f3=[](int l,int r)->bool{return l>r;};
cout << f1(1, 2) << endl;

注意:三者的用法相同,只有定义时要用的方法不同。

lambda 表达式的应用
struct Goods
{
	string _name;
	double _price;
	double _appraise;
};

int main()
{
	Goods gds[] = { { "苹果", 2.1, 10 }, { "相交", 3, 8 }, { "橙子", 2.2, 7 }, { "菠萝", 1.5, 10 } };

	sort(gds, gds + sizeof(gds) / sizeof(gds[0]), [](const Goods& g1, const Goods& g2)->bool
	{return g1._price > g2._price; });

	sort(gds, gds + sizeof(gds) / sizeof(gds[0]), [](const Goods& g1, const Goods& g2)->bool
	{return g1._appraise > g2._appraise; });

	return 0;
}

由上面的代码可以看出,lambda表达式实际上是一个匿名函数。

lambda 表达式的语法
lanbda表达式的书写格式:

以下面表达式为例:

auto f3=[](int l,int r)->bool{return l>r;};
  1. auto 用于推演f3的类型
  2. [] 捕捉列表。编译器根据[]来判断接下来的代码是否为lambda函数,捕捉列表可以捕捉上下文中提供的变量供lanbda函数使用。
  3. () 参数列表。与普通函数的列表一致。如果不需要参数可以省略
  4. ->return-type 返回值类型。用追踪返回类型形式声明函数的返回值类型。可省
  5. {} 函数体。在函数体内,除了可以使用其参数,还可以使用所有捕捉到的变量。
    注意:在lambda函数定义中,参数列表和返回值类型都是可选部分,而捕捉列表和函数体都可以为空,即 []{};,但此表达式没有任何意义!!

在上节我讲到C++11 中的右值引用,有兴趣的可以了解一下哟~
【C++11】 右值引用详解

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值