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

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

Мы не представили интерфейс для объекта iterator, но его определение подобно STL iterator. Это поддерживает оператора «*», который возвращает ссылку на связанный вход. Одноместное приращение и операторы декремента «++» и «-» продвигают iterator и назад, соответственно. Кроме того, два iterators могут быть сравнены для использования равенства «==».

Более сложное внедрение также предусмотрело бы третий тип, а именно, «константа» iterator. Такой iterator обеспечивает функцию для чтения записей, не изменяя их. (Вспомните Раздел 6.1.4.) Мы опускаем этот тип, чтобы сохранять наш интерфейс относительно простым.

Остаток от интерфейса следует из наших более ранних описаний операций по карте. Состояние ошибки происходит, если функция стирает (k), назван с ключом k, который не находится в карте. Это сообщено, бросив исключение Nonex-istentElement типа. Его определение подобно другим исключениям, которые мы видели. (См. Кодовый Фрагмент 5.2.)

9.1.3 STL наносят на карту Класс

C ++ Standard Template Library (STL) обеспечивает внедрение карты

просто названная карта. Как со многими из других классов STL мы видели, карта STL - пример контейнера, и следовательно поддерживает доступ iterators.

Чтобы объявить объект карты типа, необходимо сначала включать файл определения, названный «картой». Карта - часть станд. namespace, и следовательно любой необходимо использовать «станд.:: нанесите на карту» или предоставлять соответствующее заявление «использования».

Карта STL - templated с двумя аргументами, ключевым типом и типом стоимости. Декларация «карта <K, V>» определяет карту, ключи которой имеют тип K и чьи ценности имеют тип V. Как с другими контейнерами STL, тип iterator обеспечен и для ссылки на отдельные записи и для перечисления многократных записей. Карта iterator тип является «картой <K, E>:: iterator». (k, v) записи сохранены в сложном объекте, названном парой. Учитывая iterator на p, его связанный ключ и участников стоимости можно сослаться, используя p-> сначала и p-> второй, соответственно. (Они эквивалентны p-> ключ () и p-> стоимость () в нашей карте ADT, но отмечают, что нет никаких круглых скобок после первого и второго.)

Как с другим iterators мы видели, каждый объект карты M определяет два специальных iterators через функции, начинаются и заканчиваются, где M.begin () приводит к iterator первому элементу карты, и M.end () приводит к iterator воображаемому элементу только вне конца карты. Карта iterator p двунаправлена, означая, что мы можем двинуться вперед и назад через карту, используя приращение и операторов декремента, ++ p и-p, соответственно.

Основные членские функции карты STL даны ниже. Позвольте M, как объявлять, быть картой STL, позволять k быть ключевым объектом и позволить v быть объектом стоимости для класса M. Позвольте p быть iterator для M.

9.1. Карты 373

размер (): Возвратите ряд элементов в карте.

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

найдите (k): Найдите вход с ключом k и возвратите iterator к нему; если нет

такой ключ существует конец возвращения.

оператор [k]: Произведите ссылку на ценность ключа k; если никакой такой ключ

существует, создайте новый вход для ключа k.

вставка (пара (k, v)): Введите пару (k, v), возвратив iterator к его положению.

сотрите (k): Удалите элемент с ключом k., стирают (p): Удалите элемент, на который ссылается iterator p.

начните (): Возвратите iterator к началу карты.

конец (): Возвратите iterator только мимо конца карты.

Наша карта ADT довольно подобна вышеупомянутым функциям. Функция вставки немного отличается. В нашем ADT этому дают два аргумента. В карте STL аргумент - сложный объект пары типа, первые и вторые элементы которой - ключ и стоимость, соответственно.

Карта STL обеспечивает очень удобный способ искать, вставить, и изменить записи, перегружая нижнего оператора (» []»). Учитывая карту M, назначение «M [k] = v» вводит пару (k, v), если k уже не присутствует или изменяет стоимость, если это. Таким образом нижнее назначение ведет себя по существу то же самое как наша помещенная функция ADT (k, v). Читая ценность M [k] эквивалентен выполнению, находят (k) и доступ к части стоимости получающегося iterator. Пример использования карты STL показывают в Кодовом Фрагменте 9.3.

карта <последовательность, интервал> myMap; карта <последовательность, интервал>:: iterator p; myMap.insert (пара <последовательность, интервал> («Грабят», 28)); myMap [«Джо»] = 38; myMap [«Джо»] = 50; myMap [«Предъявляют иск»] = 75; p = myMap.find («Джо»); myMap.erase (p); myMap.erase («Предъявляют иск»); p = myMap.find («Джо»);

//(последовательность, интервал) карта//iterator к карте//вставка («Грабят», 28)//вставка («Джо», 38)//изменяются на («Джо», 50)//вставка («Предъявите иск», 75)//*p = («Джо», 50)//удаляют («Джо», 50)//удаляют («Предъявите иск», 75),

если (p == myMap.end ()) суд <<«nonexistent\n»;//продукция: «не существующий»

для (p = myMap.begin (); p! = myMap.end (); ++ p)//печатают все записи

суд <<«(» <<p-> сначала <<«,» <<p-> второй <<«) \n»;

Кодовый Фрагмент 9.3: Пример использования карты STL.

Как с другими контейнерами STL мы видели, STL не проверяет на ошибки. Это до программиста, чтобы быть уверенным, что никакие незаконные операции не выполнены.

374