六一的部落格


关关难过关关过,前路漫漫亦灿灿。




定制操作

使用sort对序列元素进行排序时, 默认使用元素类型小于运算符 < 的重载版本, 元素依序从小到大排列

如果我们需要元素从大到小排列呢? 此时需要给出排序时调用的接口

抑或是元素类型并未重载小于运算符, 也不希望如此呢? 解决方法同上

C++中有多种可调用对象 callable object :

  1. 函数
  2. 函数指针
  3. 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

谓词



定制操作

使用sort对序列元素进行排序时, 默认使用元素类型小于运算符 < 的重载版本, 元素依序从小到大排列

如果我们需要元素从大到小排列呢? 此时需要给出排序时调用的接口

抑或是元素类型并未重载小于运算符, 也不希望如此呢? 解决方法同上

C++中有多种可调用对象 callable object :

  1. 函数
  2. 函数指针
  3. 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