谓词是一个可调用的表达式,其返回结果是一个能用作条件的值。标准库算法所使用的谓词分为两类:一元谓词(unary predicate,只接受单一参数)和二元谓词(binary predicate,接受两个参数)。接受谓词参数的算法对输入序列中的元素调用谓词。因此,元素类型必须能转换为谓词的参数类型。
接受一个二元谓词参数的sort版本用这个谓词代替<来比较元素。我们提供给sort的谓词必须满足以下条件:
- 所提供的操作必须在关键字类型上定义一个严格弱序(strict weak ordering),可以将严格弱序看作"小于等于,虽然实际上定义的操作可能是一个复杂的函数。
- 两个关键字不能同时"小于等于"对方;如果k1"小于等于"k2,那么k2绝不能"小于等于"k1。
- 如果k1"小于等于"k2,且k2"小于等于"k3,那么k1必须"小于等于"k3。
- 如果存在两个关键字,任何一个都不"小于等于"另一个,那么我们称这两个关键字是"等价"的。如果k1"等价于"k2,且k2"等价于"k3,那么k1必须"等价于"k3。
下面定义的isShorter就是一个满足这些要求的函数,因此可以将isShorter传递给short。这样做会将元素按大小重新排序。
//比较函数,用来按长度排序单词
bool isShorter(const string &s1, const string &s2)
{
return s1.size() < s2.size();
}
//按长度由短至长排序words
sort(words.begin(), words.end(), isShorter);