462 Часть III. Современное программирование на C++

• Стек (stack)

• Очередь (queue)

• Приоритетная очередь (priority queue)

Внутренний контейнер, используемый адаптером, должен быть одним из последовательных контейнеров. С помощью вектора, двусторонней очереди или списка может быть реализован стек. С помощью двусторонней очереди или списка может быть реализована очередь. С помощью вектора или двусторонней очереди может быть реализована приоритетная очередь.

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

Существуют четыре ассоциативных контейнера:

• Множество (set)

• Мультимножество (multiset)

• Отображение (тар)

• Мультиотображение (multimap)

В множествах хранятся ключи. Другими словами, хранимый объект является и значением ключа. Отображения, напротив, хранят объекты и связанные с ними ключи отдельно. И множества, и отображения требуют, чтобы ключи в контейнере были уникальными. Мультимножество и мультиотображе-ние являются версиями контейнеров множество и отображение, но допускают совпадающие ключи. Ключи сравниваются с помощью функции пользователя. Если таковая не определена, нужна операция <, определенная для ключа объекта. Так, множество может использовать классы-шаблоны set<Key, compare> или set<Key>. Аналогично отображения могут использовать КЛасСЫ-ШаблОНЫ тар<Кеу, Т, Сотраге> ИЛИ тар<Кеу,Т>, ГДС Т — ТИП Хра-

нимого объекта.

Для следующего примера изменим класс STUDENT, определенный в листинге 18.5 (student2.h). Заметим, что операция эквивалентности и операция сравнения не соответствуют друг другу: операция эквивалентности основана на переменной-элементе класса STUDENT: :id, а операция сравнения — на переменной STUDENT: : grade. Для обеспечения их совместимости в листинге 18.16 операция сравнения переопределена. Иногда бывает полезно переопределить для класса и операцию вывода («). Листинг 18.16 показывает, как это может быть сделано.

h04621.jpg

class STUDENT

{

public: