1.前言
Lambda表达式着重解决的是在某种场景下使用仿函数困难的问题,而function着重解决的是函数指针的问题,它能够将其简单化。
本章重点:
本章将着重讲解lambda表达式的规则和使用场景,以及function的使用场景及bind函数的相关使用方法。
2.为什么要有Lambda表达式
在C++98中,对自定义类型进行排序时,需要自己写仿函数,并传递给sort库函数
但是如果每次要按照自定义类型的不同成员变量进行排序的话,就要写很多个仿
函数,十分的不方便,于是C++11给出了一个新玩法:
cpp
struct Goods
{
string _name; // 名字
double _price; // 价格
int _evaluate; // 评价
Goods(const char* str, double price, int evaluate)
:_name(str)
, _price(price)
, _evaluate(evaluate)
{}
};
vector<Goods> v = { { "苹果", 2.1, 5 }, { "香蕉", 3, 4 }, { "橙子", 2.2, 3 }, { "菠萝", 1.5, 4 } };
sort(v.begin(), v.end(), [](Goods g1, Goods g2)->bool
{return g1._price < g2._price; });//按照价格升序
sort(v.begin(), v.end(), [](Goods g1, Goods g2)->bool
{return g1._price > g2._price; });//按照价格降序
sort(v.begin(), v.end(), [](Goods g1, Goods g2)->bool
{return g1._evaluate < g2._evaluate; });//按照评价升序
sort(v.begin(), v.end(), [](Goods g1, Goods g2)->bool
{return g1._evaluate > g2._evaluate; });//按照评价降序
后面那一坨就完美的代替了仿函数。他其实就是传说中的lambda表达式
上述代码具体分析如下:

3.Lambda表达式的语法
lambda 表达式书写格式: [capture-list] (parameters) mutable -> return-type { statement
}
表达式部分说明:
capture-list\] : **捕捉列表** ,该列表总是出现在 lambda 函数的开始位置, **编译器根据\[\]来**
**判断接下来的代码** **是否为lambda函数** , **捕捉列表能够捕捉上下文中的变量供** **lambda**
**函数使用** 。
(parameters) :参数列表。与 **普通函数的参数列表一致** ,如果不需要参数传递,则可以
连同 () 一起省略
mutable :默认情况下, lambda 函数总是一个 const 函数, mutable 可以取消其常量
性。 **使用该修饰符时,参数列表不可省略(即使参数为空)。**
**-\>returntype** **:返回值类型** 。用 **追踪返回类型形式声明函数的返回值类型** ,没有返回
值时此部分可省略。 **返回值类型明确情况下,也可省略,由编译器对返回类型进行推**
**导**
**{statement}** **:函数体** 。在该函数体内,除了可以使用其参数外,还可以使用所有捕获
到的变量。
> **注意:**
> 在 lambda 函数定义中, **参数列表和返回值类型都是可选部分** **,而捕捉列表和函数体可以为**
**空** 。因此 C++11 中 **最简单的** **lambda** **函数为:** **\[\]{}** ; 该 lambda 函数不能做任何事情。
例:
```cpp
int main()
{
// 最简单的lambda表达式, 该lambda表达式没有任何意义
[]{};
// 省略参数列表和返回值类型,返回值类型由编译器推导为int
int a = 3, b = 4;
[=]{return a + 3; };
// 省略了返回值类型,无返回值类型
auto fun1 = [&](int c){b = a + c; };
fun1(10)
cout<int{return b += a+ c; };
cout<