Глава 18. Классы-контейнеры_________________________________437

Контейнеры с сортировкой и счетчиком

Некоторые контейнеры поддерживают версии, в которых элементы автоматически сортируются по мере добавления в контейнер. Для объявления типа сортируемый массив объектов STUDENT используется следующая нотация:

typedef TSArrayAsVector<STUDENT> SORTED_STUDENT_LIST;

Косвенные контейнеры тоже могут быть сортируемыми:

typedef TISArrayAsVector<STUDENT> SORTED_STUDENT_LIST;

Косвенные контейнеры сортируются по значениям объектов, но не по значению указателей.

Как в примере STUDENT сортировать объекты, по идентификатору или по рейтингу? Для класса STUDENT из листинга 18.1 отсутствует критерий сортировки, т. е. не определен способ сравнения объектов:

*

STUDENT si("John Newton",4.0);

STUDENT s2("Scott Courey", 3.5);

if (si < s2) // ERROR

Данные любого типа в сортируемых контейнерах должны иметь четко определенный механизм сравнения. Другими словами, должна быть определена оператор-функция operator's:. Данные базовых типов, такие как int или float, удовлетворяют этому требованию. Для пользовательских классов это означает, что операция < должна быть перегружена. Для класса STUDENT операция < не определена, поэтому ее необходимо добавить. Листинг 18.5 показывает измененную часть класса STUDENT, в которой определяется операция <.

h04371.jpg

class STUDENT

{

public:

int operator<(const STUDENT srhs) // Сортировка студентов

//по рейтингу { return (grade < rhs.grade); }

»;

Из категории классов ADT только контейнеры-массивы поддерживают сортируемую (s) версию. Что касается категории FDS, то сортируемую версию поддерживают список связей, двунаправленный список и вектор.