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


<< назад вперед >>