对于许多算法,不想使用默认的运算方式,可以使用它的重载版本,新的参数接收谓词,从而会对序列中的元素调用谓词,元素类型必须能转换为谓词参数的类型
可调用表达式:可以使用()调用运算符调用,包括函数,函数指针,lambda,bind,重载()的类……
(n元)谓词:一个可调用表达式,接受n个参数
限制:特定算法仅可接受特定n元的谓词,传入函数()形式的谓词时,可能并不满足参数个数的限制,所以应使用其他形式
lambda
定义:[capture list捕获列表] (parameter list参数列表) ->return type返回类型(尾置返回) {function body函数体}
auto name = lambda
必须存在【】& {},其他可以省略
【capture list】:lambda可以定义在函数中,但要使用局部变量,必须包含在capture list中
- 空捕获:【】不使用所在函数的任何局部变量
- 显示:【name list】【&name list】:使用拷贝的形式,注意拷贝发生在定义lambda时,而非调用()时,因此在定义后修改name list的值,没有任何效果。 注意在使用&捕获时,要注意&对象在lambda调用时存在
- 隐式:【=】【&】自动推断,
- 混合显示与隐式:【=,&name】【&,name】,注意第一个元素必须是=|&隐式捕获,表示默认捕获方式。 注意显示捕获必须与隐式使用不同的方式
parameter list:不能有默认参数
return type:当function body尾return的形式,可以自动推断,否则为void
注意:当lambda作为函数return返回值,不能包含引用捕获,和函数不能返回局部引用一个原理
调用:和普通函数相同,都使用()调用运算符
lambda作为谓词,可以控制lambda的参数个数
bind()
#include <functional>
相较于lambda,bind用于多次使用相同的操作时,而不是多次编写相同的lambda
定义 : auto newCallable新的可调用对象 = bind(callable可调用对象, parameter list参数列表)
调用:newCallable(parameter list)
调用newCallable时会调用callable并传入参数列表(parameter list)
parameter list:
- 普通参数
- std::placeholders::_n占位符:表示调用newCallable传入的第n个参数,
- 引用参数:ref()返回给定对象的引用
简化占位符使用
- using std::placeholders::_1; using std::placeholders::_2;……
- using namespace std::placeholders;