目录
前言-lambda表达式的介绍:
C++11推出lambda表达式,lambda表达式实际上是一个匿名函数,他的具体书写格式如下:
lambda格式:[capture-list] (parameters) mutable -> return-type { statement }
1、[capture-list]表示捕捉列表,他是lambda函数的标志性符号,编译器会根据[]来判断该式子是否为lambda函数,他的另一个作用是可以捕捉父类作用域的变量给到lambda函数使用,因此叫捕捉列表。
2、(parameters)表示lambda的参数列表,他的用法和意义跟普通函数的形参列表是一样的,如果不需要对lambda传任何参数则可以连同括号一起省略。
3、mutable的作用是消除捕捉列表中的常属性,因为lambda的捕捉列表中的变量都是默认被const修饰的,因此lambda函数内部是不能修改[capture-list]中的参数,但是加上mutable后就可以在函数体内部修改捕捉的参数了。注意:如果加上mutable则参数列表(parameters)必须有参数,即使参数列表为空。
4、-> return-type表示lambda函数的返回值类型,他的意义等同于普通函数的返回类型,只不过在lambda函数中可以省略-> return-type(不管lambda函数有没有返回值都可以省略),由编译器自动推导该lambda函数的返回值类型。
5、{ statement }表示lambda的函数体,因为lambda实际上是一个匿名函数,所以他也有属于自己的函数体,并且在捕捉列表中的变量可以在该函数体内使用。
从以上叙述可以得到一个有趣的写法,因为lambda表达式中只有捕捉列表和函数体的标识符不能省略,因此最简单的lambda函数可以写为:[]{},该lambda函数没有实现任何的功能。
1、lambda表达式的作用
为什么会C++11会推出lambda表达式呢?因为在此之前,我们如果要自己实现一个仿函数则需要手写一个类,如果要实现的逻辑复杂而多样,则要实现多个类进行仿函数的调用,类一旦多了起来就会有重名的烦恼,并且实现的类的目的仅仅是为了的仿函数调用,难免会感到大材小用,比如以下示例:
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
struct Shop
{
string _name;//商品名字
double _price;//价格
int _evaluate; // 评价
Shop(const char* str, double price, int evaluate)
:_name(str)
, _price(price)
, _evaluate(evaluate)
{}
friend ostream& operator<<(ostream& out, const Shop& s);
};
ostream& operator<<(ostream& out, const Shop& s)//流提取
{
cout << s._name << " " << s._price << " " << s._evaluate << endl;
return out;
}
struct ComparePriceLess//价格低的优先
{
bool operator()(const Shop& gl, const Shop& gr)
{
return gl._price < gr._price;
}
};
struct ComparePriceGreater//价格高的优先
{
bool operator()(const Shop& gl, const Shop& gr)
{
return gl._price > gr._price;
}
};
int main()
{
vector<Shop> v = { { "苹果", 12.2, 5 }, { "香蕉", 3.3, 4 }, { "橙子", 6.6,
3 }, { "菠萝", 1.5, 4 } };
sort(v.begin(), v.end(), ComparePriceLess());
//打印
for (auto num : v)
{
cout << num;
}
cout << endl;
sort(v.begin(), v.end(), ComparePriceGreater());
//打印
for (auto num : v)
{
cout << num;
}
cout << endl;
}
运行结果:


最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



