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

9.5. Словари 411

9.5 Словари

Как карта, словарь хранит пары значения ключа (k, v), который мы называем записями, где k - ключ, и v - стоимость. Точно так же словарь допускает ключи и ценности, чтобы иметь любой тип объекта. Но, тогда как карта настаивает, чтобы у записей были уникальные ключи, словарь допускает многократные записи, чтобы иметь тот же самый ключ, во многом как английский словарь, который допускает многократные определения для того же самого слова.

У способности снабдить многократные записи тем же самым ключом есть несколько заявлений. Например, мы могли бы хотеть сохранить отчеты для авторов информатики, внесенных в указатель их именем и фамилией. С тех пор есть несколько случаев различных авторов с тем же самым именем и фамилией, естественно будут некоторые случаи, где мы должны иметь дело с различными записями, имеющими равные ключи. Аналогично, многопользовательской компьютерной игре, вовлекающей игроков, посещающих различные комнаты в большом замке, возможно, понадобилась бы карта - свистят с комнат на игроков. Это естественно в этом заявлении позволить пользователям быть в той же самой комнате одновременно, однако, участвовать в сражениях. Таким образом эта игра естественно была бы другим применением, где будет полезно допускать мульти - ple записи с равными ключами.

9.5.1 Словарь ADT

ADT словаря довольно подобен карте ADT, который был представлен в Секунду -

tion 9.1. Основные различия включают выпуск многократных ценностей, разделяющих общий ключ. Как с картой ADT, мы предполагаем, что есть объект, названный Им - erator, который обеспечивает способ сослаться на записи словаря. Есть специальная стоимость стража, конец, который используется, чтобы указать на несуществующий вход. iterator может быть увеличен от входа до входа, позволив перечислить записи от коллекции.

Как ADT, (незаказанный) словарь D поддерживает следующие функции:

размер (): Возвратите число из записей в D.

пустой (): Возвратитесь верный, если D пустой и ложный иначе.

найдите (k): Если D содержит вход с ключом, равным k, то возвратитесь

iterator p обращение любого такого входа, еще возвратите специальный конец iterator.

findAll (k): Возвратите пару iterators (b, e), такой что все записи

со значением ключа k находятся в диапазоне от b до, но не включая, e.

вставка (k, v): Вставьте вход с ключом k и оцените v в D, возвратившись

iterator, относящийся к недавно созданному входу.

412

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

сотрите (k): Удалите из D произвольный вход с ключом, равным k;

состояние ошибки происходит, если у D нет такого входа.

сотрите (p): Удалите из D вход, на который ссылается iterator p;

состояние ошибки происходит, если p указывает до конца стражу.

начните (): Возвратите iterator к первому входу D.

конец (): Возвратите iterator к положению только вне конца D.

Обратите внимание на то, что операция считает прибыль (k) произвольным входом, ключ которого равен k, и сотрите (k), удаляет произвольный вход со значением ключа k. Чтобы удалить определенный вход среди тех, которые имеют тот же самый ключ, было бы необходимо помнить, что iterator оценивают p, возвращенный вставкой (k, v), и затем используют операцию, стирают (p). Пример 9.2: В следующем мы показываем ряд операций на первоначально пустом словаре, снабжающем записи ключами целого числа и ценностями характера. В колонке «Продукция» мы используем пи примечания: [(k, v)], чтобы означать, что операция возвращает iterator, обозначенный пи, которое относится к входу (k, v).

Хотя записи не обязательно сохранены в любом особом заказе, чтобы осуществить операцию findAll, мы предполагаем, что пункты с теми же самыми ключами сохранены рядом. (Альтернативно, операция findAll должна была бы возвратить более умную форму iterator, который возвращает ключи из равной стоимости.)

Операция

Продукция

Словарь

пустой ()

верный

вставка (5, A)

p1: [(5, A)]

(5, A)

вставка (7, B)

p2: [(7, B)

(5, A), (7, B)

вставка (2, C)

p3: [(2, C)

(5, A), (7, B), (2, C)

вставка (8, D)

p4: [(8, D)

(5, A), (7, B), (2, C), (8, D)

вставка (2, E)

p5: [(2, E)

(5, A), (7, B), (2, C), (2, E), (8, D)

найдите (7)

p2: [(7, B)

(5, A), (7, B), (2, C), (2, E), (8, D)

найдите (4)

конец

(5, A), (7, B), (2, C), (2, E), (8, D)

найдите (2)

p3: [(2, C)

(5, A), (7, B), (2, C), (2, E), (8, D)

findAll (2)

(p3, p4)

(5, A), (7, B), (2, C), (2, E), (8, D)

размер ()

5

(5, A), (7, B), (2, C), (2, E), (8, D)

сотрите (5)

-

(7, B), (2, C), (2, E), (8, D)

сотрите (p3)

-

(7, B), (2, E), (8, D)

найдите (2)

p5: [(2, E)]

(7, B), (2, E), (8, D)

Операция findAll (2) прибыль iterator пара (p3, p4), относясь к попыткам en-(2, C) и (8, D). Предположение, что записи сохранены в упомянутом выше заказе, повторив от p3 до, но не включая, p4, перечислило бы записи

(2, C), (2, E).