Г. Шилдт - Полный справочник по C++ (1109478), страница 96
Текст из файла (страница 96)
Сначала итератор р с помощью функции еп()() устанавливается на конец списка. Поскольку Глава 24. Введение в стандартную библиотеку шаблонов функция епд() возврашает итератор„установленный на объект„расположенный за последним объектом в списке, перед использованием итератор р следует уменьшить на единицу. Именно по этой причине итератор р в цикле вывода уменьшается перед выполнением оператора соцс, а не после. Никогда не слелует забывать, что функция епд() возврашает указатель не на последний элемент контейнера, а на юедуюя(ий за ним элемент. Сравнение функций ровЬ 1гоп1Ц и рова ЬаоЩ Список можно созлавать, добавляя элементы либо в его конец, либо в начало.
До сих пор мы добавляли элементы только в конец списка и применяли для этого функцию рай ъаси() . Для того чтобы добавить элементы в начало списка, следует вызвать функцию рпяь ясаке(). рассмотрим пример. /* Демонстрация различий между функциями рцяи Ъаск() и рцяи сходе(). *у Вьпс1цсте <ьояххеат> Мьпс1цое <11яс> ияьпд пязаеярасе яхбн ьпс мазо() ( 11ЯС<апх> 1яс1, 1яс2з ьпс йох(1=0; 1<10; 1++) 1яС1.рави Ъасх(1); сох(1=0; 1<10; 1++) 1яС2.рсяЪ йхопх(1)з 11яс<ьпс>::ьсехасох р; сосо « "Содержимое списка 1яС1: М"; р = 1ях1.Ъес(ьп(); >Ъ11е(р .'= 1яс1.епс)()) ( соцс « *р « р++; соцс « "1пхп" з соцх « "Содержимое списка 1яС2г тп"'; р = 1яс2.Ъедьп(): мЪ11е(р )= 1яс2.епс)()] ( соцс « *р « р+е' ) хесцхп Оз ) Эта функция выводит на экран слелуюшие результаты.
содержимое списка 1яс1: 0 1 2 3 4 5 6 7 8 9 Содержимое списка 1ях2: 9 8 7 6 5 4 3 2 1 О Поскольку при создании списка 1яс2 элементы добавлялись в начало, порядок их следования противоположен порядку следования элементов в списке 1вс1, при создании которого они добавлялись в конец. Часть П. Язык С++ Сортировка списка Список можно упорядочить, вызвав функцию-член вове() .
Следующая программа создает список, состоящий из случайных целых чисел, а затем сортирует их в порядке возрастания. // Сортировка списка. 41пс1пс)е <1овг сеат» $1пс1ис)е <11вс> 41пс1пде <свсс)11Ь> ивхпд пазеврасе вод; 1пе паап() ( 11вс<1пс> 1вс; 1пе 1ю // Создаем список, состоящий иэ случайных целых чисел.
бот(1=0; а<10; 1++) 1вс.рави Ьас)г(тапс)()); соус « "исходное содержимоег хп") 11вс<1пс>:".1сехасох р = 1зе.Ьед1п()) ыЬ11е(р ! = 1зс,епс)() ) ( сопс « *р « р~< сопс « епс)1 « епс)1/ // Упорядочиваем список. 1зе.ветс(); попс « "Упорядоченное содержимое:1п"; р = 1вс.Ьед1п(); зи11е(р != 1вс.епй()] ( сопс « *р « р++; ) хе-пгп О/ ) Вот как выглялит примерный вывод этой программы. Исходный список: 41 18467 6334 26500 19169 15724 11478 29358 26962 24464 Упорядо юенный список: 41 6334 11478 15724 18467 19169 24464 26500 269262 29358 Вставка одного списка в другой Упорядоченный список можно вставить в лругой список, Результатом этой операции является упорядоченный список, отстоящий из элементов исходных списков. Новый список хранится в вызывающем объекте, а второй список становится пустым. Эта операция иллюстрируется следуюшил» примером.
Первый список состоит из четных чисел от О до 9. Второй список состоит из нечетных чисел. После слияния этих списков образуе~ся последовательность О ) 2 3 4 5 б 7 8 9. Глава 24. Введение в стандартную библиотеку шаблонов // Слияние двух списков. Фтпс1иг)е <1овстеагп> $1пс1иг)е <1звс> пв).пд паиеврасе всг); Тпс иа1пО ( 11вт<ьпт> 1вт1, 1втг; Тпс 1у тот(1=0/ 1<10; 1+=2) 1вт1.рпвп Ьас)с(1); тот(1=1г 1<11; 1+=2) 1втг.рпви Ьас)г(1); попс « "Содержимое списка 1вс1т вп"; 1твс<ьпс>::зсетасот р = 1вс1.ьедьп(); нЬ11е(р != 1вс1.епг)О ) сопс « "р « ) солт « епб1 « епс)1; солт « "Содержимое списка 1втгт ьп"> р = 1вс2.Ьедгп(); ьи11е(р )= 1вег.епг)О ) ( соус « *р « р++ ~ ) солт « епг)1 « епг)1; // Объединяем два списка.
1вс1.иетде (1вт2) г 11(1втг.еиртуО ) солт « "Теперь список 1ве2 пуст1п'; СОУС « "СОЛЕржИМОЕ СПИСКа 1ВС1 ПОСЛЕ СЛИяНИяь 1П"; р = 1вт1.ЬедьпО; ин11е(р != 1вс1.епг)О ) ( сопс « "р « " ° г р++г ) тееитп ог ) Рассмотрим результаты работы этой программы, Содержимое списка 1вт1: 0 г 4 6 а Содержимое списка 1ве1: 1 3 5 7 9 теперь список 1вс2 пуст Содержимое списка 1вт1 после слияния: 0 1 2 3 4 5 6 З 8 9 Этот пример имеет еше олпу особенность, связанную с прилгенением функции епвгсу() . Если вызывающий контейнер пуст, она возврашает значение стае.
Обратите внимание на то, что функция завтде() улаляет все элементы из списка, поллежашего вставке. Результаты работы программы это подтверждают. Часть!1. Язык С++ Список, содержащий объекты класса Рассмотрим пример. в котором используется список объектов класса гнуе1авв. Обратите внимание на то, что в этом классе перегружаются операторы "<'*, ">", ">ее и " ". (При работе с некоторыми компиляторами это делать не обязательно, в то же время другие компиляторы вынуждают перегружать е>це и дополнительные операторы.) В библиотеке ЗТ(.
эти операторные функции используются для сравнения объектов, хранягцихся а контейнере. Даже если список не упорядочен, иногда приходится сравнивать элементы при поиске, сортировке или слиянии. // Список„ солеркаший объекты. №йпс1ибе <йов»теазп> №йпс1пде <11в»> №йпс1иде <св»т1пя> ивйпя пагаеврасе в»с): с1авв пус1авв ( 1п» а, Ьг йп» вшю рпЬ11с ~ геус1авв[> ( а = Ь = 0; ) эгус1авв(гп» 1, йп» б> ( а=в; Ь=Зг вше = а + Ь; ) йп» де»вша[) ( ге»пгп яшю Ъоо1 орега»от<(сопя» гзус1авв йо1, сопя» пус1авв йо2> ( ге»птп о1.вша « о2.вшзг Ьоо1 орега»ог>(сопв» п1ус1авв йо1, сопя» пус1авв йо2) ( те»птп о1.вша > о2.ягипг ) Ьоо1 орега»от==(сопя» пус1авв йо1, сопв» гхус1авв йо2) ( ге»пгп о1.
вша == о2.впп; Ьоо1 орета»от>=(сопя» геус1авв йо1, сопя» гаус1авв йо2) ( те»игп о1.яшз != о2.вшю ) Глава 24. Введения в станйартнув библиотеку шаблонов Ыепс> Ьоо1 №тйепб Ьоо1 гт1епс) Ьоо1 гг1епб Ьоо1 орега»от< (сопя» пус1авв йо1, сопв» пус1авв йо2>г ореха»ог>(сопя» пус1авв йо1, сопв» агус1авв йо2); орета»от== (сопя» гпус1авв йо1, сопя» шзс1аяв йо2>; орета»ог>=[сопя» геус1авв йо1, сопя» пус1авв йо2>г 1пс иазп() ( зпс з.з // Создаем первый список. 11вс<тус1авв> 1ве1/ год(з.=Оз з'.<10з 1++) 1вс1.рпвЬ Ьася(лзус1авв(1, з))з соил « "Первый список: 11ВС<муо1ааа>Ззебвтаесд Р = 1ВС1.ЬЕд1П() мЬ11е(р != 1ве1.епб() ) ( соне «р->деевом() « р++з соме « епй1з // Создаем второй список.
11вс<зтус1авв> 1вс2з бог(1=0з 1<10з 1++) 1ве2.рнвЬ Ьасй(иус1авв(1*2, з*3)) сонб « "Второй список: р = 1ве2.Ьедз.п() з иЬ11е(р з= 1вс2.епб()] ( соне « р->дегани() « Гз++ з сопс «епб1з // Выполняем слияние списков 1вс1 и 1ве2. 1ве1.иегде(1ве2) з // Выводим на экран объединенный список. соне « "Объединенный список: р = 1вс1.Ьедзл() з ийз1е(р ! = 1всг.еп<)() ) ( соус «р->деевом() « р++з ) геспгп Оз ) Программа создает два списка, содержащих объекты класса взус1ввв, и выводит на экран содержимое кажлого списка.
Затем она выполняет слияние списков и выводит результат, приведенный ниже. | Первый списокз 0 2 4 6 8 10 12 14 16 18 Второй список: О 5 10 15 20 25 30 35 40 45 Объединенный список: 0 0 2 4 5 6 8 10 12 14 15 16 18 20 25 30 35 40 45 Й| Ассоциативные контейнеры ~'<Я Класс вар создает ассоциативный контейнер, в котором каждому ключу соответствует единственное значение. По существу, ключ представляет собой имя, с помощью которого лквкно получить требуемое значение.
Если в контейнере зазанится некое значение, доступ 524( Част И. Я С+т к нему возможен только через юпоч. Таким образом, ассоциативный контейнер фактически хранит пары ключ-значение. Преимущество ассоциативных массивов заключается в доступе к значениям по их ключам. Например, можно создать ассоциативный контейнер, в котором ключом является имя человека„а значением — номер его телефона. В настоящее время ассоциативные контейнеры получают все более широкое применение. Как указывалось ранее, ассоциативные контейнеры могут содержать лишь уникальные ключи.
Лубликаты не допускаются. Если необходимо создать ассоциативный контейнер, в котором можно хранить лубликаты, следует применять класс во1сяаес. Шаблонная спецификация класса юэар имеет следующий вид. сетзр1асе <с1авя кеу, с1авя т, с1аяя сопр = 1евя<кеу>, с1авя й11осагсг = а11осаесг<ра1г<сопве )<еу,т» с1авя вар Здесь класс кеу определяет тип ключа, шаблонный параметр т задает тип данных, хранящихся в ассоциативном массиве, а функция с<вар позволяет сравнивать два ключа. По умолчанию в качестве функции совр применяется станлартный функтор 1евв().
распределитель памяти задается классом й11осаеог, причем по умолчанию используется стандартный класс а11осасог. Класс мар имеет следующие конструкторы. ехр1ю сгг юзар(сопве Сспр асюююрГп=Сотар(), сопят й11ссаеог Ьа = й11осаеог())Ю вюзр(попас тоар<кеу,Т,Союзр,й11осасог> ьоЬ)ю сеяр1асе <с1авв 1п1сег>1зяс(тп1сег мап, 1пхсег еа(, сопят союпр а<труп = сспюр(), сопяе й11ссаесг аа = й11осасог(])ю Таблица 24.4. Функции, определенные в классе гпар Функцию>член Описание зсегасог Ьея1п()ю сопвг зеегаеог Ьеязп() сопвсю Возвращает итератор, установленный на первый эле- мент ассоциативного массива Удаляет из ассоциативного массива все элементы чоза с1еаг()ю в1яе суре сочпе (сопвг кеу суре ая) сопвгю Возвращает текущее количество дубликатов элемента со значением )г в ассоциативном массиве Возвращает значение егия, если ассоциативный массив пуст, в противном случае возвращает значение еа1ве Возвращает итератор, установленный на первый эле- мент ассоциативного массива Ьоо1 еяреуы еопвею 1еегаеог епа() ю сопев 1еегасог епа() сопвгю ага Глава 24.
Введение в стандартную библиотеку шаблонов Первая версия конструктора создает пустой ассоциативный массив. Вторая — ассоциативный контейнер, солержаший элементы объекта оЬ. Третий вариант конструктора создает ассоциативный массив, состоящий из элементов, лежащих в диапазоне, заданном итераторами агап и елс(. Функция стартал определяет порядок следования элементов массива.
Как правило, любой объект, использующийся в качестве ключа. должен опрелелять конструктор по умолчанию, а также оператор "<'* и другие операторы сравнения. Специфические требования, предъявляемые к ключам, зависят от компилятора. В классе мар определены следующие операторы сравнения: «, =, (кы », и Некоторые функции-члены, определенные в классе юкар, перечислены в табл. 24.4. В этой таблице класс )сеу суре прелставляет собой тип ключа, а класс ча1це суре определяет тип ра1г<кеу. т>.