什么是lambda表达式?:一块代码单元,可以理解为未命名的内联函数。
形式:【捕获列表】(参数列表)->返回类型 { 表达式体 }
例子:
[ ](const string& s1, const string& s2){ return s1.size() < s2.size()};
可以省略参数列表和返回类型,但是必须包括捕获列表和表达式体
auto f = [ ] { return 100};
cout << f(); //输出100
捕获列表:
只有捕获列表中捕获一个所在函数的局部变量,才能够在表达式体中使用。
显示捕获
- 值捕获 :直接写变量的名字:例如:[size] { }
- 引用捕获 : 例如:[&size] { }
隐式捕获:让编译器根据表达式体中的代码来推断我们需要哪些变量。=表示值捕获,&表示引用捕获
比如:[=] {}; {&} {};
也可以混合使用显示捕获和隐士捕获,此时,捕获列表的第一个必须是&或者=,并且显示和隐式必须使用不同的捕获方式,比如:隐式捕获使用了=,后面显示捕获必须使用引用捕获(&变量名)。[=, &size] { }
如何改变一个别捕获的变量?
在参数列表尾部添加mutable关键字。例如:auto f = v mutable {retuern ++v;}
**bind()函数**
头文件:#include <functional>
形式: auto newCallable = bind(callable, arg_list)
newCallable:新可调用对象
callable: 原函数
arg_list是传给原函数的参数,可以是多个。里面可能包含“_n”的名字,n是一个整数。这些是“占位符”,表示的意思是:这里是一个参数,这个参数是在调用newCallable是传进来的,如果是“_1”,表示newCallable的第一个参数.一次类推。
比如:auto g = bind(func, a, b, _2, c, _1);
g(X,Y)等价于func(a, b, Y, c, X);
举个例子:
场景:我们在使用find_if函数时候,第三个参数只能穿一个函数指针,那么这个函数的参数怎么在调用它的时候传呢?
bool fun(const string& s, int size)
{
return s.sie()>=size;
}
find_if(v.begin(), v.end(), bind(fun,_1, 4));
来源:https://blog.csdn.net/prefect_boy/article/details/99600165