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

Глава 9. Хеш-таблицы, Карты и карта Списков Пропуска. Мы можем перечислить все записи карты m, инициализировав p к m.Begin () и затем неоднократно увеличивая p, пока это не равно m.End ().

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

Карта ADT состоит из следующего:

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

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

найдите (k): Если M содержит вход e = (k, v), с ключом, равным k, то

возвратите iterator p относящийся к этому входу, и иначе возвратите специальный конец iterator.

помещенный (k, v): Если у M нет входа с ключом равным k, то

добавьте вход (k, v) к M, и иначе, замените область стоимости этого входа с v; возвратите iterator к в - serted/modified вход.

сотрите (k): Удалите из M вход с ключом, равным k; ошибка

условие происходит, если у M нет такого входа.

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

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

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

конец (): Возвратите iterator к положению только вне конца M. Мы обеспечили два средства удаления записей, одно данное ключ и другой данный iterator. Основанная на ключе операция должна использоваться только, когда известно, что ключ присутствует в карте. Иначе, необходимо сначала проверить, что ключ существует, используя операцию «p = M.find (k)», и если так, затем примените операцию M.erase (p). У находящейся в iterator операции по удалению есть преимущество, что это не должно повторять поиск ключа, и следовательно более эффективно.

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

карта не перечислена ни в каком особом заказе.

9.1. Карты

371

Операция

Продукция

Карта

пустой ()

верный

помещенный (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)

помещенный (2, E)

p3: [(2, E)]

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

найдите (7)

p2: [(7, B)]

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

найдите (4)

конец

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

найдите (2)

p3: [(2, E)]

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

размер ()

3

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

сотрите (5)

-

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

сотрите (p3)

-

(7, B)

найдите (2)

конец

(7, B)

9.1.2 C ++ интерфейс карты

Прежде, чем обсудить определенные внедрения карты ADT, мы сначала определяем C ++

интерфейс для карты в Кодовом Фрагменте 9.2. Это не полный C ++ класс, просто декларация государственных функций. Интерфейс - templated двумя типами, ключевым типом K и типом V стоимости.

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

Карта класса //наносят на карту интерфейс

общественность:

Вход класса; //(ключ, стоимость) класс пары Iterator; //iterator (и положение)

международный размер () константа;

//

число записей в карте

пустой bool () константа;

//

действительно ли карта пуста?

Iterator находят (константа K& k) константу;

//

найдите вход с ключом k

Итерэтор поместил (константа K& k, константа V& v);

//

вставьте/замените пару (k, v)

пустота стирает (константа K& k)

//

удалите вход с ключом k

бросок (NonexistentElement);

пустота стирает (константа Iterator& p); //стирают вход в p Iterator, начинаются (); //iterator к первому входу конец Iterator (); //iterator, чтобы закончить вход

;

Кодовый Фрагмент 9.2: неофициальный интерфейс C ++ Map (не полный класс). В дополнение к его членским функциям интерфейс определяет два типа, Вход и

Iterator. Эти два класса обеспечивают типы для входа и объектов iterator, соответственно. Вне класса к ним получили бы доступ с Картой <K, V>:: Вход и Карта <K, V>:: Iterator, соответственно.

372