向算法传递函数
使用谓词重新定制某些算法的操作
谓词是一个可调用的表达式,返回结果是一个能用作条件的值,能接受几个参数就是几元谓词,要想调用谓词必须保证元素类型能转为谓词的参数类型

bool Isshorter(const string &s1,  const string &s2)
{
    return s1.size() < s2.size();
}
sort(words.begin(), words.end(), Isshorter);//使用谓词,按从短到长排序

stable_sort
稳定排序算法,可以在满足自定义排序的前提下,再进行默认排序

lambda表达式
一般的谓词只能接受最多两个参数,使用lambda可以解决这个问题
find_if:接受一组迭代器作为搜索范围,第三个参数是一元谓词,对范围内每个元素调用谓词,若谓词返回真,算法将返回这个元素,否则返回尾迭代器
lambda本质上是一种可调用对象,可以理解成一种未命名的内联函数,我们可以向算法传递可调用对象,函数、函数指针、重载了函数调用运算符的类都是可调用对象
lambda具有一个返回类型、一个参数列表和一个函数体,与函数不同点在于,可以在函数内定义lambda
一般形式为【捕获列表】(参数列表) -> 返回类型 {函数体},捕获列表是一个lambda所在函数中定义的局部变量列表(通常为空),lambda必须使用尾部返回来指定返回类型,可以忽略参数列表和返回类型,但是不能忽略捕获列表和函数体,lambda根据函数体判断返回类型