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

9.5. Словари 413

9.5.2 C ++ внедрение словаря

В этой Секции мы описываем C ++ внедрение словаря ADT. Наше внедрение, названное HashDict, является подклассом класса HashMap с Секунды - tion 9.2.7. Карта ADT уже включает большинство функций словаря ADT. Наш класс HashDict осуществляет новую вставку функции, которая вводит пару значения ключа и функцию findAll, который производит диапазон iterator для всех ценностей, равных данному ключу. Все другие функции унаследованы от HashMap.

Чтобы поддержать тип возвращения findAll, мы определяем вложенный класс под названием Диапазон. Это представлено в Кодовом Фрагменте 9.23. Этот простой класс хранит пару объектов типа Iterator, конструктор и две членских функции для доступа к каждому из них. Это определение будет вложено в общественной части определения класса HashMap.

Диапазон класса //диапазон iterator

частный:

Iterator начинаются; //фронт диапазона конец Iterator; //конец диапазона

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

Диапазон (константа Iterator& b, константа Iterator& e) //конструктор

: начните (b), конец (e)

Iterator& начинаются ()возвращение начинается; //g и b, например, я nni ng Iterator& конец ()возвращают конец; //g и конец

;

Кодовый Фрагмент 9.23: Определение класса Диапазона, который будет добавлен к HashMap.

Определение класса HashDict представлено в Кодовом Фрагменте 9.24. Как обозначено в первой линии декларации, это - подкласс HashMap. Класс начинается с определений типа для типов Iterator и Entry от базового класса. Это сопровождается кодексом для Диапазона класса от Кодового Фрагмента 9.23, и декларации государственной функции.

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

класс HashDict: общественный HashMap <K, V, H>

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

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

typedef typename HashMap <K, V, H>:: Iterator Iterator; typedef typename HashMap <K, V, H>:: Вход Входа;//.. декларация класса Диапазона .insert здесь

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

HashDict (международная способность = 100); Диапазон findAll (константа K& k); вставка Iterator (константа K& k, константа V& v);

;

//государственные функции//конструктор//находит, что все записи с k//вводят пару (k, v)

Кодовый Фрагмент 9.24: HashDict класса, который осуществляет словарь ADT.

414

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

Заметьте, что, обращаясь к родительскому классу, HashMap, мы должны определить его параметры шаблона. Чтобы избежать потребности в том, чтобы все время повторять этих parame-террористов, мы предоставили определения типа для классов входа и iterator. Поскольку большая часть словаря, функции ADT уже обеспечены HashMap, мы должны только предоставить конструктору и недостающему словарю функции ADT.

Определение конструктора представлено в Кодовом Фрагменте 9.25. Это просто в - берет все взятки конструктор для базового класса. Обратите внимание на то, что мы используем сжатый func-tion примечание, которое мы ввели в Разделе 9.2.7.

/* HashDict K, V, H:: */ //конструктор

HashDict (международная способность): HashMap <K, V, H> (способность)

Кодовый Фрагмент 9.25: класс конструктор HashDict.

В Кодовом Фрагменте 9.26, мы представляем внедрение вставки функции. Это сначала определяет местонахождение ключа, призывая полезность искателя (см. Кодовый Фрагмент 9.15). Вспомните, что эта полезность возвращает iterator к входу, содержащему этот ключ, если найдено, и иначе это возвращает iterator до конца ведра. В любом случае мы немедленно вставляем новый вход до этого местоположения, призывая полезность вставки. (См. Кодовый Фрагмент 9.16.) iterator ссылка на получающееся местоположение возвращена.

/* HashDict K, V, H:: */ //вводят пару (k, v)

Вставка Iterator (константа K& k, константа V& v)

Iterator p = искатель (k);

Iterator q = вставка (p, Вход (k, v)); возвратите q;

//найдите, что ключ//вставляет, он здесь//возвращает свое положение

Кодовый Фрагмент 9.26: внедрение словаря функционирует вставка.

Мы эксплуатируем собственность того, как вставка работает. Каждый раз, когда новый вход (k, v)

вставленный, если структура уже содержит другой вход (k, v ) с тем же самым ключом, сервисная функция искателя возвращает iterator к первому такое возникновение. Полезность вставки тогда вставляет новый вход только до этого. Из этого следует, что все записи, имеющие тот же самый ключ, сохранены в последовательности смежных положений, всех в пределах того же самого ведра. (Фактически, они появляются в перемене их заказа вставки.) Это означает, что, чтобы произвести диапазон iterator (b, e) для требования findAll (k), оно достаточно, чтобы установить b в первый вход этой последовательности и установить e во вход немедленно после последнего.

Наше внедрение findAll дано в Кодовом Фрагменте 9.27. Мы сначала призываем функцию искателя, чтобы определить местонахождение ключа. Если искатель возвращает положение в конце некоторого ведра, мы знаем, что ключ не присутствует, и мы возвращаем пустой iterator (конец, конец). Иначе, вспомните из Кодового Фрагмента 9.15, что искатель возвращает первый вход с данным значением ключа. Мы храним это во входе iterator b. Мы тогда пересекаем