lambda表达式,bind函数

有些话、适合烂在心里 提交于 2019-11-27 08:23:36

什么是lambda表达式?:一块代码单元,可以理解为未命名的内联函数。

形式:【捕获列表】(参数列表)->返回类型 { 表达式体 }

例子:

[ ](const string& s1, const string& s2){ return s1.size() < s2.size()};

可以省略参数列表和返回类型,但是必须包括捕获列表和表达式体
auto f = [ ] { return 100};
cout << f(); //输出100
捕获列表:
只有捕获列表中捕获一个所在函数的局部变量,才能够在表达式体中使用。

显示捕获

  1. 值捕获 :直接写变量的名字:例如:[size] { }
  2. 引用捕获 : 例如:[&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));
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!