谓词
2023年12月24日 2023年12月24日
定制操作
使用sort对序列元素进行排序时, 默认使用元素类型小于运算符 <
的重载版本, 元素依序从小到大排列
如果我们需要元素从大到小排列呢? 此时需要给出排序时调用的接口
抑或是元素类型并未重载小于运算符, 也不希望如此呢? 解决方法同上
C++中有多种可调用对象 callable object
:
- 函数
- 函数指针
- lambda表达式
…
可以对可调用对象使用调用运算符 ()
使用泛型算法接口时指定关键操作的实现, 即传入可调用对象, 以迎合实际开发过程中的各种需求
谓词
predicate
我们将传递给算法的可调用对象称作谓词
谓词是一个可调用的表达式,其返回结果是一个能用作条件的值
- | |
---|---|
一元谓词 unary predicate |
只接受单一参数 |
二元谓词 binary predicate |
有两个参数 |
接受谓词参数的算法对输入序列中的元素调用谓词
要求元素类型能转换为谓词的参数类型
给sort传递二元谓词
长度由短至长排序
1bool isShorter(const string &s1, const string &s2) 2{ 3 return s1.size() < s2.size(); 4} 5 6sort(words.begin(), words.end(), isShorter);
给stable_sort传递二元谓词
稳定排序算法不改变相等元素的相对顺序
示例
1elimDups(words); 2 3stable_sort(words.begin(), word.end(), isShorter); 4// 此例中, stable_sort可以保持等长元素间的字典序 5 6for (const auto &s : words) 7 cout << s << " "; 8cout << endl;
调用elimDups之后的words
fox jumps over quick red slow the turtle
调用stable_sort之后的words
fox red the over slow jumps quick turtle