函数指针,仿函数,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;};
- auto 用于推演f3的类型
- [] 捕捉列表。编译器根据[]来判断接下来的代码是否为lambda函数,捕捉列表可以捕捉上下文中提供的变量供lanbda函数使用。
- () 参数列表。与普通函数的列表一致。如果不需要参数可以省略
- ->return-type 返回值类型。用追踪返回类型形式声明函数的返回值类型。可省
- {} 函数体。在函数体内,除了可以使用其参数,还可以使用所有捕捉到的变量。
注意:在lambda函数定义中,参数列表和返回值类型都是可选部分,而捕捉列表和函数体都可以为空,即[]{};
,但此表达式没有任何意义!!
在上节我讲到C++11 中的右值引用,有兴趣的可以了解一下哟~
【C++11】 右值引用详解