Глава 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, в которой определяется операция <.
class STUDENT
{
public:
int operator<(const STUDENT srhs) // Сортировка студентов
//по рейтингу { return (grade < rhs.grade); }
»;
Из категории классов ADT только контейнеры-массивы поддерживают сортируемую (s) версию. Что касается категории FDS, то сортируемую версию поддерживают список связей, двунаправленный список и вектор.