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 показывает, как это может быть сделано.
class STUDENT
{
public: