先提一下lambda
lambda表达式是c++11的新特性,匿名函数对象
形式如下:
cpp
[ capture ] ( params ) opt -> ret { body; };
capture:捕获列表
params:参数列表
opt:函数选项
ret:返回值类型
body:函数体
cpp
//这种写法指定返回值int 是尾置类型推导的写法,当我们在函数执行前不知道返回值
//是什么类型时可以用这种方式指定返回值
auto f = [](int a) -> int {return a + 1;};
cout << f(3) << endl;
//auto f(int) ->bool { return true;}
//== bool f(int) {return true;}
\]:不捕获任何外部变量;
\[\&\]:以引用方式捕获所有外部变量;
\[=\]:以值方式捕获所有外部变量;
\[var1, var2, ...\]:指定捕获特定的外部变量;
\[\&, var1, var2, ...\]:以引用方式捕获所有外部变量,并指定捕获特定的外部变量;
\[=, \&var1, \&var2, ...\]:以值方式捕获所有外部变量,并以引用方式捕获特定的外部变量。
**返回值有时可以省略,可以自动推导**
```cpp
auto f1 = [](int a, int b) { return a < b; };
cout << f1(1,2);
```
**lambda原理是创建了一个匿名类,并重载了函数调用运算符(),相当于仿函数,实现了一个operator()方法**
```cpp
auto print = []{cout << "Hello World!" << endl; };
相当于
class print_class
{
public:
void operator()(void) const
{
cout << "Hello World!" << endl;
}
};
auto print = print_class(); //此时print是一个函数对象,或者说仿函数
```
**c++11使用std::function描述C++中所有可调用实体,它是可调用对象的包装器**
```cpp
#include