谓词函数是一个判断式,一个返回bool值的函数或者仿函数。几元就是函数有几个参数,至于定义和使用,函数定义和一般的函数定义一样,仿函数就是写个类,然后重载operator()。使用就是在那些以这种需要返回bool值的函数作参数的函数里用了。
一元举例
1,判断给出的string对象的长度是否小于6
bool GT6(const string &s)
{
return s.size() >= 6;
}
2,判断给出的int是否在3到8之间
bool Compare( int i )
{
return ( i>= 3 && i<= 8 );
}
二元举例
1,比较两个string对象,返回一个bool值,指出第一个string是否比第二个短
bool isShorter(const string &s1, const string &s2)
{
return s1.size()<s2.size();
}
算法命名规则
区别带有一个值或一个谓词函数参数的算法版本
很多算法通过检出其输入范围内的元素实现其功能。这些算法通常要用到标准关系操作符:== 或<。其中的大部分算法会提供第二个版本的函数,允许程序员提供比较或测试函数取代操作符的使用。
1,重新对容器元素排序的算法要使用<操作符。这些算法的第二个重载版本带有一个额外的形参,表示用于元素排序的不同运算:
sort(beg,end); //use<operator to sort the elements
sort(beg,end,comp); //use function named comp to sort the elements
2,检测指定值的算法默认使用 == 操作符。系统为这类算法提供另外命令的(而非重载的)版本,带有谓词函数形参。带有谓词函数形参的算法,其名字带有后缀 _if:
find(beg, end, val); //find first instance of val in the input range
find_if(beg, end, pred); //find first instance for which pred is true in the input range
上述两个算法都在输入范围内寻找指定元素的第一个实例。其中,find算法查找一个指定的值,而find_if算法则用于查找第一个使谓词函数pred返回非零值的元素。
标准库为这些算法提供另外命名的版本,而非重载版本,其原因在于这两种版本的算法带有相同数目的形参。而对于排序算法,只要根据参数的个数就很容易消除函数调用的歧义。而对于查找指定元素的算法,不管检查的是一个值还是谓词函数,函数调用都需要相同个数的参数。此时,若使用重载版本,则可能导致
二义性,尽管几率很低。因此标准库为这些算法提供两种不同名字的版本,而没有使用重载。