一 lambda表达式
1. 组成:返回类型、捕获列表、参数列表、函数体;捕获列表、函数体不可缺少
auto f = [ ] {return 42;} 该函数的调用也需要使用( ),f( );
[ ](const string& a, const string& b) {return a.size() < b.size(); }
2. 捕获变量
1)lambda表达式可以出现在一个函数内部,使用其局部变量,但是只能使用那些明确指明 的变量;2)一个lambda通过将局部变量包含在捕获列表中来指明将会使用这些变量;
捕获列表指引lambda在其内部包含访问局部变量所需的信息;
只有在捕获列表中捕获了局部变量,才能在函数中使用该局部变量
① [sz] (const string& str) {return str.size() > sz} 捕获sz,正确
② [ ] (const string& str) {return str.size() > sz} 未捕获sz,错误
③ 捕获列表只适用于局部非静态变量,表达式可以使用局部静态变量,以及所在函数之外的
变量
3)值捕获、引用捕获
4) [this]{x += 1}:捕获列表中的this,加了this可以使用类对象中的成员变量
3)指定返回类型
二 std::bind()
1. 用法
在某些情况下,使用lambda与使用函数有相同的效果;
但是,对于find_if( )这种只能接受一元谓词的函数,使用接受两个参数的函数,来设置条件,就无法正常使用了;
如何解决将接受两个参数的函数转变为接受一个参数的函数?
2. std::bind()
std::bind( )作为一个通用的函数适配器,接受一个可调用对象,并生成一个新的可调用对象
auto newCallbale = std::bind(callable, arg_list)
arg_list:参数列表,用逗号分隔,对应callable的参数;调用newCallable时,newCallable
会调用callable,并将arg_list传入callable函数
3. 使用std::bind()
std::bind、std::ref、std::cref都定义于functional;
1)bind函数的参数
auto test2 = std::bind(test1, 1, 7, std::placeholders::_1, 2, std::placeholders::_2)
上述两个函数中,test1接受5个参数;test2接受2个参数,test2接收的2个参数,会作为test1的第3、5个参数;
2)对参数重新排序
可以使用bind函数对参数进行重新排序,适用于比较大小的场景,使用bind函数对参数进行重新排序之后,不必在重新写一个函数。
3)绑定引用参数
① 正常情况下,对于非占位参数,bind是以复制的形式传入原来函数中
② 引用用法:
for_each(words.begin(), words.end(), bind(print, std::ref(os), std::placeholders::_1))