1.11. Возвращаясь к алгоритму sort
Функция qsort из стандартной библиотеки С является достаточно общей, потому что она принимает в качестве четвертого аргумента функцию сравнения, определяемую пользователем. При использовании алгоритма sort в разделе 1.4 подобный аргумент отсутствовал, так как sort полагался на оператор сравнения «меньше чем» <. Если имеем дело с массивами экземпляров класса, мы можем придать этому оператору любое значение по нашему усмотрению, но это невозможно, если элементами массива являются значения какого-либо встроенного типа, например int. Допустим, мы захотим отсортировать массив в нисходящем, а не в восходящем порядке. Конечно, это можно сделать, отсортировав массив сначала в восходящем порядке, а затем применив алгоритм reverse, обсуждавшийся в предыдущем разделе. Но мы можем решить задачу другим способом, используя алгоритм sort с третьим аргументом, который задает функцию сравнения, как в случае с qsort. Например:
// dsortl.cpp: Сортировка в нисходящем порядке
// с использованием функции сравнения.
#include <iostream>
#include <algorithm>
using namespace std;
bool comparefun(int x, int y)
{ return x > y;
}
int main()
{ const int N = 8;
int a[N] =
{1234, 5432, 8943, 3346, 9831, 7842, 8863, 9820};
cout << "Before sorting:\n";
copy(a, a+N, ostream_iterator<int>(cout, " "));
cout << endl;
sort(a, a+N, comparefun);
cout << "After sorting in descending order:\n";
copy(a, a+N, ostream_iterator<int>(cout, " "));
cout << endl;
return 0; }
Вспомним, что мы обсуждали использование сору для вывода, как это делается в данной программе, в конце раздела 1.9. Нам необходимо определить функцию comparefun таким образом, чтобы значение comparefun(a[i], a\j]) равнялось true тогда и только тогда, когда после сортировки a[i] должно
Введение в функциональные объекты
43
предшествовать a\j]. Функции, которые подобно comparefun возвращают значение типа bool, называются предикатами. Программа создает следующий вывод:
Before sorting:
1234 5432 8943 3346 9831 7842 8863 9820
After sorting in descending order:
9831 9820 8943 8863 7842 5432 3346 1234
<< назад вперед >>