1,向算法传递函数
①首先我们先来了解一下什么是谓词,谓词分为一元谓词与二元谓词,几元就代表接受几个参数,谓词是一个表达式,他的返回结果是一个能够作为条件的值。
我们先来举一个书上面的例子:
//比较函数,用来按照长度排序单词
bool isshorter(const string &s1,const string &s2)
{return s1.size()<s2.size();}
//按照长度由短到长排序word
sort(word.begin(),word.end(),isshorter);
我们可以看到上面是一个比较大小的函数,而sort算法接受三个参数,第三个参数就是一个二元谓词(因为这个表达式有两个参数),它表示将word里面的元素按照第三个参数所起的作用来进行运算。需要注意的是,容器里面元素的类型必须能转换为谓词的参数类型。
②排序算法
如果我们希望将Word按照大小重排的同时,还希望具有相同长度的元素按照字典序排列,我们用stable_sort算法
stable_sort(word.begin(),word.end(),isshorter);
这条语句既能够生出stable_sort算法的作用又能生出isshorter这条表达式的作用。
③find_if算法来查找第一个具有特定大小的元素,它接受一对迭代器,表示一个范围。但与find不同的是find_if第三个参数是一个谓词,find_if算法对输入序列中的每个元素调用给定的这个谓词。它返回第一个使谓词返回非0值得元素,如果不存在这样的元素,则返回尾迭代器。
④介绍lambda
一个lambda具有一个返回类型,一个参数列表和一个函数体,它是一个表达式,格式如下:
【捕获列表】(参数列表)返回类型{函数体};与普通函数不同的得是lambda必须使用尾置函数返回
我们可以举一个例子来加深印象
auto f=[] {return 42;}
cout<<f()<<endl;//打印42
我们编写一个与isshorter相同功能的lambda
[](const string &a,const string &b){return a.size()>b.size();}
我们同样来实现②中的功能:
stable_sort(word.begin(),word.end(),[](const string &a,const string &b){return a.size()>b.size();})
我们可以看出来第三个参数就是lambda表达式,它不需要像②中那样再重新再外面重写一个isshorter函数。