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

368 Глава 9. Хеш-таблицы, карты и списки пропуска

9.1 Карты

ключ

стоимость

Карта

вход

Рисунок 9.1: концептуальная иллюстрация карты ADT. Ключи (этикетки) назначены на ценности (папки) пользователем. Получающиеся записи (маркированные папки) вставлены в карту (картотека). Ключи могут использоваться позже, чтобы восстановить или удалить ценности.

Карта позволяет нам хранить элементы, таким образом, они могут быть расположены, быстро используя ключи. Мотивация для таких поисков - то, что каждый элемент, как правило, хранит дополнительную полезную информацию помимо своего ключа поиска, но единственный способ достигнуть ту информацию состоит в том, чтобы использовать ключ поиска. Определенно, карта хранит пары значения ключа (k, v), который мы называем записями, где k - ключ, и v - своя соответствующая стоимость. Кроме того, карта, ADT требует, чтобы каждый ключ был уникален, таким образом, ассоциация ключей к ценностям определяет отображение. Чтобы достигнуть высшего уровня общности, мы позволяем и ключам и ценностям, сохраненным в карте иметь любой тип объекта. (См. рисунок 9.1.) В карте, хранящей студенческие отчеты (такие как имя студента, адрес и оценки за курс), ключ мог бы быть идентификационным номером студента. В некоторых заявлениях ключ и стоимость могут быть тем же самым. Например, если бы у нас была карта, хранящая простые числа, то мы могли бы использовать каждое число само и в качестве ключа и в качестве его стоимости.

В любом случае мы используем ключ в качестве уникального идентификатора, который назначен appli-

катион или пользователь к связанному объекту стоимости. Таким образом карта является самой соответствующей в ситуациях, где каждый ключ должен быть рассмотрен как своего рода уникальный адрес индекса для его стоимости, то есть, объект, который служит своего рода местоположением для той стоимости. Для экзамена - ple, если бы мы хотим сохранить студенческие отчеты, мы, вероятно, хотели бы использовать студенческие идентификационные объекты в качестве ключей (и отвергнуть двум студентам, имеющим тот же самый студенческий ID). Другими словами, ключ, связанный с объектом, может быть рассмотрен как «адрес» для того объекта. Действительно, карты иногда упоминаются как ассоциативные магазины или ассоциативные контейнеры, потому что ключ, связанный с объектом, определяет свое «местоположение» в структуре данных.

9.1. Карты 369

Записи и образец состава

Как упомянуто выше, карта хранит пары значения ключа, названные записями. Вход - actu-

соединитесь с примером более общего ориентированного на объект шаблона, образца состава, который определяет единственный объект, который составлен из других объектов. Пара - самый простой состав, потому что он объединяет два объекта в единственный объект пары.

Чтобы осуществить это понятие, мы определяем класс, который хранит два объекта в его первых и вторых членских переменных, соответственно, и обеспечивает функции, чтобы получить доступ и обновить эти переменные. В Кодовом Фрагменте 9.1, мы представляем такое внедрение, хранящее единственную пару значения ключа. Мы определяем Вход класса, который является templated основанный на типах стоимости и ключе. В дополнение к конструктору это предоставляет участнику func-tions что ссылки возвращения на ключ и стоимость. Это также обеспечивает функции, которые позволяют нам устанавливать ключ и оценивать участников.

шаблон <typename K, typename V>

Вход класса //(ключ, стоимость) пара

общественность: //государственные функции

Вход (константа K& k = K (), константа V& v = V ()) //конструктор

: ключ (k), оцените (v)

константа K& ключ () константаклавиша ENTER;

//

станьте ключевыми

константа V& стоимость () константавозвращаемое значение;

//

получите стоимость

пустота setKey (константа K& k)ключ = k;

//

установите ключ

пустота setValue (константа V& v)оценивает = v;

//

стоимость набора

частный:

//

частные данные

K ключ;

//

ключ

V стоимостей;

//

стоимость

;

Кодовый Фрагмент 9.1: C ++ класс для входа, хранящего пару значения ключа.

9.1.1 Карта ADT

В этой секции мы описываем карту ADT. Вспомните, что карта - коллекция ключа -

записи стоимости, с каждой стоимостью, связанной с отличным ключом. Мы предполагаем, что карта обеспечивает специальный объект указателя, который разрешает нам к справочным записям карты. Такой объект обычно называли бы положением. Когда мы сделали в Главе 6, чтобы быть более совместимыми с C ++ Стандартная Библиотека Шаблона, мы определяем несколько более общий объект, названный iterator, который может и сослаться на записи и провести вокруг карты. Учитывая карту iterator p, к связанному входу может получить доступ dereferencing iterator, а именно, как *p. К отдельному ключу и стоимости можно получить доступ, используя p-> ключ () и p-> стоимость (), соответственно.

Чтобы продвинуть iterator от его настоящего положения до следующего, мы перегружаем

оператор приращения. Таким образом, ++ p достижения iterator p к следующему входу

370