Г. Шилтд - Самоучитель C++ (DJVU) (1114955), страница 67
Текст из файла (страница 67)
Третья форма — это конструктор ассоциативного списка, содержащего диапазон элементов, заданный итераторами начало и конец. Функция сравнения ф сравн, Глава 14. Библиотека стандартных шаблонов если она присутствует, задает порядок сортировки элементов ассоциатив- ного списка. Как правило, для любого объекта, заданного в качестве ключа, должны быть определены конструктор по умолчанию и несколько операторов сравнения. Для класса тар определяются следующие операторы сравнения: 1= ) В табл. 14.4 представлены функции — члены класса тар. В данной таблице тип )Феу (уре — это тип ключа, а )геу ча1ие — тип пары ключ/значение (тип рагг< Кеу, Т>).
Описание з)ве 1уре соип1 (сопз1 кеу 1уре е)г) сопз1; Ьоо! егпрФУ() сопз1; Иега1ог епФФ()! сопз1 Иега1ог епгФ() сопз1; чо)б егазе(нега1ог !); чопФ егазе(Нега(ог начало, Иега1ог конец); зИе Фуре егаве (сопз1 кеу 1уре й Ц ! апосаФог Фуре пеФ а((оса1ог() сопв1; Функция-член ИегаФог Ьед(п(); сопзФ ИегаФог Ьея!и() сопвФ; чоЫ с(еаг(); ра(г<негаФог, ИегаФог> ек)иа! гвпяе(сопвФ кеу 1уре еЦ! ра)г<сопвФ ИегаФог, сопз1 Иега1ог> ециа! гап9е(сопв1 кеу 1уре %Ц сопз1; Иега1ог Ф)пг! (сопзФ Кеу Фуре (Ф)г)! сопв()ФегаФог Ф)пФФ (сопз( кеу 1уре %Ц сопзФ; Таблица 14.4. Функции — члены класса тар Возвращает итератор первого элемента ассо- циативного списка Удаляет все элементы ассоциативного списка Возвращает 1 или О, в зависимости от того, встречается или нет в ассоциативном списке ключ /г Возвращает истину, если вызывающий ассо- циативный список пуст, в противном случае возвращает ложь Возвращает итератор конца ассоциативного списка Возвращает пару итераторов, которые указывают на первый и последний элементы ассоциативного списка, содержащего указанный ключ lт Удаляет элемент, на который указывает ите- ратор 1 Удаляет элементы, заданные между итерато- рами начало и конец Удаляет элементы, соответствующие значению ключа lг Возвращает итератор по заданному ключу к.
Если ключ не обнаружен, возвращает итера- тор конца ассоциативного списка Возвращает распределитель памяти ассоциа- тивного списка 448 Описание Функция-член Иега1ог )пвегФ(йегаФог 1, сопв1 ча(це 1уре бзиачеиие)! 1егпр(аФе<с)авз (пйег> чо!г! Епзегг((пйег начало, (пйег «оиец); рв(г<йегаФог, Ьоо(>(пвег1 (сопв1 ча(це 1уре йзначение); )сеу согпраге (геу„согпр() сопв1; Иега1ог (очгег Ьоппд (сопвФ )сеу Фуре а(г)! сопвФ ИегаФсг (овгег Ьеипд (сопвФ (геу Фуре М) сопвФ; з(*е 1уре гпах в(зе() сопв1; гегегепсе орега1огЦ (сопв1 кеу 1уре (Ф1); гечегве Иега1ог гЬе9(п(); сспзФ гечегве йега1ог гЬея)п() сопвФ; гечегве ИегаФог гепд(); сопвФ„гечегзе Иегазог гепг(() сопв1; вгае 1уре в(ге() сопв1; чоЫ вччар(гпар<Кеу, Т, Сестр, А((осаФог> йабъект); Иега1ог иррег Ьоцпг! (сойвФ кеу Фуре ЙЦ„.
сопзФ„йегазог иррег ЬоиМ (сопв1 Меу 1уре ЙГг) сопз1; чв!це„согпраге ча(це согпр() сопз1; Самоучитель С++ Таблица 14.4 (продолжение) Вставляет параметр значение на место элемента или после элемента, заданного итера- тором 1. Возвращает итератор этого элемента Вставляет последовательность элементов, заданную итераторами начало и конец Вставляет значение в вызывающий ассоциативный список.
Возвращает итератор вставленного элемента. Элемент вставляется только в случае, если такого в ассоциативном списке еще нет. При удачной вставке элемента функция возвращает значение рв(г<йегаФог, Фгце>, в противном случае — рай<Нега!от, !а(зе> Возвращает объект-функцию сравнения клю- чей Возвращает итератор первого элемента ассо- циативного списка, ключ которого равен ипи больше заданного ключа « Возвращает максимальное число элементов, которое можно хранить в ассоциативном списке Возвращает ссылку на элемент, соответствующий ключу !.
Если такого элемента не существует, он вставляется в ассоциативный список Возвращает обратный итератор конца ассо- циативного списка Возвращает обратный итвратор начала ассо- циативного списка Возвращает хранящееся на данный момент в ассоциативном списке число элементов Обменивает элементы из вызывающего ассо- циативного списка с элементами из объекта объект Возвращает итератор первого элемента ассоциативного списка, ключ которого больше заданного ключа « Возвращает объект-функцию сравнения зна- чений Глава 14. Библиотека стандартных шаблонов 449 МапрзайвчсЗ.азз КЕуре, с1еяя улуре> яСтпсС ретв ( Еуребет Кеуре аерзюй ахат; '~' ттет ключа Суреаей уЕуре второй тип; уу тип Значении Ксуре первый т 22 содержит ключ Усуре второй; уу содержит значение // конструкторы ре-т ( ); ралк (сопзлк(.уре йк, сопяс усуре гту) леюр1аТв<оьазз А, сьаяя в> ранг (сопев, в> аобзекз1 Ранее уже говорилось, что значение переменной иервый содержит ключ и значение, а значение переменной второй — значение, соответствующее этому ключу.
Создавать пары ключ/значение можно не только с помощью конструкторов класса ра(г, но и с помощью функции тпаЫе ра!гО, которая создает объекты типа ра!г, используя типы данных в качестве параметров. Функция пса!(е ра!г0 — это родовая функция со следующим прототипом: лввр1аке<о1азз К(уре, с1аяя УЕуре> раз.к<Каре„УЕуре>юаа1св уал.к (сопят К1уре бт, сопя| Муре бу) Как видите, функция возвращает объект типа ра!г, содержащий заданные в качестве параметров функции значения типов К1~ре и И~ре.
Преимушество использования функции та!(е ра!гО состоит в том, что она дает возможность компилятору автоматически распознавать типы предназначенных для хранения объектов, и вам не нужно указывать их явно. В следующей программе на примере ассоциативного списка, предназначен- ного для хранения десяти пар ключ/значение, иллюстрируются основы ис- пользования ассоциативных списков. Ключом здесь является символ, а зна- чением — целое. Пары ключ/значение хранятся следующим образом: А в С О 1 2 Поскольку пары хранятся именно таким образом, то, когда пользователь на- бирает на клавиатуре ключ (т. е.
одну из букв от А до 3), программа выводит на экран соответствующее этому ключу значение. В ассоциативном списке хранятся пары ключ/значение в виде объектов типа ра(г. Шаблон объекта типа ра1г имеет следующую спецификацию: 4бо Самоучитель //Иллюстрация возможностей ассоциативного списка ((1пс1ис?е <1озсгеата> ((1пс1цбе <пар> цз(пя пагпезрасе з(с(; ш( татп (( ?вар<слег, гпз> лл 1п?. 1 размез(ение пар в ассоциативном списке гог (1=0; 1<10; ьч-.т( ( ?а.
1пзеГ?. (ратг<снаг, 1пе>('А' -~ 1, 1( ( сваг с?Н сопе « "Введите ключ: "т сз тт »с?т; мр<спаг, афпг>:: 1сегасог р; поиск значении по заданному клюв р =-?л. йвпс((сЬ); ?Г (р !=пг.епс?(( ? соас « р->весов<(( е1зе соцс « "Такого ключа в ассоциативном списке Нет~в"( геецгп 0; Обратите внимание на использование класса-шаблона ра1г для образования пар ключ/значение. Типы данных, указанные в классе-шаблоне ра!г, должны соответствовать типам данных, хранящимся в ассоциативном списке. После того как ассоциативный список инициализирован парами ключ/значение, найти нужное значение по заданному ключу можно с помощью функции ЙпйО. Функция йвй() возврагцает итератор соответствующего ключу элемента или итератор конца ассоциативного списка, если указанный ключ не найден. Когда соответствующее ключу значение найдено, оно сохраняется в качестве второго члена класса-шаблона ра(г.
2. В предыдущем примере типы пар ключ/значение были указаны явно в конструкции ра)г<еЬаг, шт>. Хотя такой подход совершенно правилен, часто проще использовать функцию пийв уа)гО, которая создает пары объектов на основе типов данных своих параметров. ((1пс1цс(е <1озггеал> ((1пс1цс?е <вар> цз(пя патвезрасе зМ; шаблонов 451 Библиотека Глава стандартных )пг гпа1п ( ) вар<с)тат, цго> дп тп~ // размещение пар в ассоциативном списке гог(1=о! 1<10; 1++) ( Пт.(ПВЕГт (вьа)се раъг(С))аГ) ('А' Е ), 1) ); ) сваг сп; сопв « "Введите ключ: ") съп » с)т; вар<сваг, 1пг>;: ъвегагог р; поиск значения по заданноиу ключу р =.
ю. Еьпс1(с)т); ъй (р ! — т. епс) () соцс « р->весопо; е1ве сонг « "Такого ключа в ассоциативном списке нет~п"„ ге(игп 0; Данный пример отличается от предыдущего только строкой т.ъпвегТ(ви)се раьг(спад) ('А' + 1, 1) ); В данном случае, чтобы в операции сложения 'А' + 1 не допустить автоматического преобразования в тип пй, используется приведение к типу с))аг. Во всем остальном процесс определения типов объектов выполняется автоматически. 3, Так же как и вдругих контейнерах, в ассоциативных списках можно хранить создаваемые вами типы данных. Например, в представленной ниже программе создается ассоциативный список для хранения слов с соответствующими словам антонимами.