Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Data Structures and Algorithms in C++ 2e (На ру...docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.37 Mб
Скачать

8.1. Приоритетный тип данных резюме очереди 325

Пример 8.3: геометрический алгоритм может сравнить пункты p и q в двух-imen-sional пространство, их x-координатой (то есть, p£ q если £ ïêñqx), чтобы сортировать их от левого

исправляться, в то время как другой алгоритм может сравнить их их y-координатой (то есть,

p£ q, если py£ qy), чтобы сортировать их от основания до вершины. В принципе нет ничего

имение отношение к понятию пункта, который говорит, должны ли пункты быть сравнены

x-или y-координатами. Кроме того, много других способов сравнить пункты могут быть определены (например, мы можем сравнить расстояния p и q от происхождения).

Есть несколько способов достигнуть цели независимости типа элемента и метода сравнения. Наиболее общий подход, названный методом состава, основан на определении каждого входа нашей приоритетной очереди, чтобы быть парой (e, k), состоя из элемента e и ключа k. Часть элемента хранит данные, и ключевая роль хранит информацию, которая определяет приоритетный заказ. Каждый ключевой объект определяет свою собственную функцию сравнения. Изменяя ключевой класс, мы можем изменить путь, которым приказывают очереди. Этот подход очень общий, потому что ключевая роль не должна зависеть от данных, существующих в части элемента. Мы изучаем этот подход более подробно в Главе 9.

Подход, который мы используем, немного более прост, чем метод состава. Это основано на определении специального объекта, названного компаратором, работа которого состоит в том, чтобы предоставить определение функции сравнения между любыми двумя элементами. Это может быть сделано различными способами. В C ++, компаратор для типа E элемента может быть осуществлен как класс, который определяет единственную функцию, работа которой состоит в том, чтобы сравнить два объекта типа E. Один способ сделать это должно перегрузить» ()» оператор. Получающаяся функция берет два аргумента, a и b, и возвращает булево, стоимость которого верна если <b. Например, если «isLess» - название нашего объекта компаратора, функция сравнения призвана, используя следующую операцию:

острова (a, b): Возвратитесь верный если <b и ложный иначе.

Могло бы казаться сначала, что, определяя просто меньше функция скорее ограничена, но обратите внимание на то, что возможно получить всех других относительных операторов, объединяясь менее - чем сравнения с другими булевыми операторами. Например, мы можем проверить, равны ли a и b с (! острова (a, b) &&! острова (b, a)). (См. Упражнение R-8.3.)

Определяя и Используя объекты компаратора

Давайте рассмотрим более конкретный пример класса компаратора. Как упомянуто в

вышеупомянутый пример, давайте предположим, что мы определили структуру класса, названную Point2D, для хранения двумерного пункта. В Кодовом Фрагменте 8.1, мы представляем два компаратора. Компаратор LeftRight осуществляет слева направо заказ, сравнивая x-координаты пунктов и компаратор BottomTop imple-ments заказ основания к вершине, сравнивая y-координаты пунктов.

Чтобы использовать эти компараторы, мы объявили бы два объекта, один из каждого типа. Давайте назовем их leftRight и bottomTop. Заметьте, что эти объекты хранят нет

326

класс LeftRight

общественность: