Г. Шилтд - Самоучитель C++ (DJVU) (1114955), страница 66
Текст из файла (страница 66)
Цикл завершится, когда итератор р укажет на конец списка. 3. Поскольку список является двунаправленным, размещать элементы в нем можно как с начала списка, так и с его конца. В следующей программе создается два списка, причем во втором списке организуется обратный первому порядок расположения элементов.
// Элементы можно размещать не только начиная с начала списка, // но также и начиная с его конца ()1пс1ис(е <1оясгеащ> ()1пс1пс(е <!1ят> из|па патпеярасе вЫ; 1п( паьп ( 7 ( 11яс<с)тат> 1ас; 11яс<сЬаг> ге~1яс; 1пс Гог(1=0; 1<10; 1++) 1я~.рпвЬ Ьаск('А' + 1) сопл « "Размер прямого списка = " « 1вс.вазе () « епб1; сопв « "Содержимое прямого сгллска: 11ас<спаг>;:1сегаког р; Удаление элементов из первого списка // и размещение их в обратном порядке во втором списке иЬ11е (! 1вс .етпрсу() ) ( р = 1аС.Ьеф.п(); сопл « р; 1вс.рор Ггопс()! ге~г1вс.риаЬ Ггопс(*р): 7 сопс «епс(1; сопл « "Размер обратного списка = сопл С< геч1ас.в1ае() « епб1; сопб « "Содержимое обратного списка: ") р геу1вс.Ьергп(); хЬ11е(р != гет1вс.епо()) сопс « "р; р++~ 441 Глава 14.
Библиотека стандартнык шаблонов ге'сига О; После выполнения программы на экране появится следующее: Размер прямого списка = 10 Содержимое прямого списка: >гвсокрйнт,т Размер обратного списка = 10 Содержимое обратного списка: гтнс~косв>г В данной программе реверс списка 1з( достигается следующим образом: элементы поочередно извлекаются из начала списка 1а1 и размещаются в начале списка гет1аЬ Таким образом в списке гет!М реализуется обратный порядок расположения элементов.
4. Вызвав функцию-член вог10, вы можете отсортировать список. В следующей программе создается список случайных символов, а затем эти символы сортируются. // Сортировка списка ()1пс1ибе <1оветеаи> ((1пс1в<(е <1(а1> ((1пс1обе <сзМ11Ь> из)пд пагпезрасе зМ; (п( пв1л () 11вс<сйаг> 1вс; з.пл т > // заполнение списка случайными символами Гол(1=0; 1<10; 1++) 1вс.ривЬ Ьас>;( 'А' ~ (кап<)() %26) ); соШ « "Исходное содержимое ..
" т 11в<<сЬат>:: 1сеталОК Р = 1вЬ.Ьедвп(> > иЬ11е (р ! = 1ве, ел~(П ) соне «р' р++; 1 сонс «епс(1; О сортировка списка 1вс аоге()> сопС « "Отсортированное содержимое: р = 1ве.Ьед1д(); нЬ11е (р! = 1ак. елб () > сопв «*р; р+-~-; Самоучитель гевптп 0; После выполнения программы на экране появится следующее: Исходное содержимое: РН()ЙН()МЕАМ Отсортированное содержимое: йЕЙННМРЖт 5. Отсортированный список можно слить с другим. В результате будет получен новый отсортированный список с содержимым, состоящим из содержимого обоих исходных списков. Новый список остается в вызывающем списке, а второй список оказывается пустым. Ниже представлен пример слияния двух списков. В первом находятся символы АСЕС1, а во втором — ВВЕЛ.
После слияния мы получим последовательность АВСРЕгСН1Л. О Слияние двух списков ()1пс1пс(е <1ояетеат> () 1пс1пс)е <11ят > пя1па папзеярасе я1с); ни жа1п ( ) 11яв<снат> 1яс1, 1ят2; гпс тот (1=0р 1<10р 1<=2) 1яс1.риян Ьас)<( 'А'+ 1); йот (1=1; 1<11; 1+=2) 1яе2.рпяЬ Ьас)с( 'и' ж 1) ) сопс « "содержимое первого списка: 11яс<сЬат>:: гсетатот р = 1яс1. Ьедяп ()у н)л11е(р != 1вт1 . ЕПС) О ) ( сонь « "'р; р+ж; соус « еп61; сост « "Содерхсжое второго списка; р = 1яе2.Ьедгп() р иЬ11е(р )= 1ят2.епс)()) сонг « "р; р++г сопв « епс11; Слияние двух списков 1яе1.летие (1яе2); гв (1яе2, евку() ) сост « "Теперь второй список пустХп"; Глава 14, Библиотека 443 стандартных шаблонов сонг сс "Содержимое первого списка после слияния:~п"; р = 1аС1.ЬецьпО; ю)т(1е (р != 1ас1.епс(() ) сопг « *р; р.~ + ге1игп О; После выполнения программы на экране появится следующее: Содержимое первого списка: АСЕС1 Содержимое второго списка: ВПРНТ Теперь второй список пуст Содержимое первого списка после слияния: АВСПЕРСНт,т 6.
В следующем примере список используется для хранения объектов типа Рго)ес1. Рго)ес1 — это класс, с помошью которого организуется управление программными проектами. Обратите внимание, что для объектов типа Рго)ес1 перегружаются операторы <, >, ! и ==. Перегрузки этих операторов требует компилятор М(сгозо(1 Ч(зиа1 С++ 5. 1Именно этот компилятор использовался при отладке примеров данной главы.) Для других компиляторов может потребоваться перегрузить какие-либо дополнительные операторы.
В библиотеке стандартных шаблонов с помощью указанных оператор-функций сравниваются объекты, хранящиеся в контейнере. Хотя список не является контейнером с упорядоченным хранением элементов, тем не менее и здесь при поиске, сортировке или слиянии элементы приходится сравнивать. ()1пс1ис(е <1оасгеатв> ()бпс1пс)е <11вг> ()ьпс1пс(е <свкггпд> пвъпд папеврасе вгб; с1авв Ргобесл риЫ1с: снаг пале [401 с ъпс раув ко сощр1ел"'оп; Р оЗесС() ( вегсру (петле, " с)ауа Со сощр1егьоп =- 0; ) Ргоэесе (спа» *и, гпс с() ( всгсру (пгзае, г.): г(аув со соыр1есьоп = б; Самоучитель С++ чо(й айй йауз(1по 1) ( йауз го соп~р1ег1оп += чо1й звЬ с(ауз(3.пе 1) ( йауз го сотр1ег1оп =- ) Ьоо1 соп~р1еТей() ( гегнгн !йауз ~о сотпр1е~1оп; ) воЫ героге () ( сома « нате « сонг « йауз со сод~р1еа' оп; сонв « " дней до завершения~в"; ьоо1 орегагог<(сопз1 Рхо1есг йа, соняг Ргойесг яь) гегигн а.йауз Ьо сопр1ег1оп к Ь.йауз Ьо сотвр1еЬ1оп; Ьэо1 орега~ог>(сопев Рго.(есг ьа, соняг Ргоз)есг ьЬ) ( гегигп а.йауз ~о сожр1еТРоп > Ь.йауз Ьо сотр1ег1оп; ьоо1 орегагог (сопзг Рго-)есв аа, соняв Рго~есг.
ьЬ) гевнгн а.йауз йо сотр1ег1оп == Ь.йауз Ьо соп~р1ег'оп; ьоо1 орегавог!=(сопят Рго-)есв ьа, соняв Рго1есв аЬ) гевнгн а.йауз го соп~р1егйоп != Ь.йауз го сотр1е~йопр ) 1нв твайт () ( 11яг<Рго-) есг> рго-); рго ). ризЬ Ьас)с(Рго1есе("Разработка компилятора", 35)); рго1,рнзЬ Ьас)с(Рго0ест.(" Разработка электронной таблнцы", 190)); рго ).ризЬ Ьас)с(Рго1ес~("Разработка ятт,", 1000)); 11з~<Рго.)ест>::хЬега~ог р = ртов,Ьед1п(); вывод проектов на экран ыЬ11е (р )= рго1.епй()) р->героге(); р++; Глава 14. Библиотека стандаргныхшаблонов 1! увеличение сроков выполнения первого проекта на 10 дней р = ргоб.Ьедшп<)у р->агЫ о)аув<10)р // последовательное завершение первого проекта Йо р->выЬ г)аув <5): р-)герогг1); ) ъ'Ы1е <<р->сошртееео <) ); гетигп О; После выполнения программы на экране появится следующее: 1.
Поэкспериментируйте с представленными примерами. Попытайтесь делать небольшие изменения в программах и исследуйте результаты. 2. В примере 1 после вывода информации на экран список опустел. В примере 2 вы узнали об одном из способов исследования содержимого списка, при котором он остается неповрежденным. Можете ли вы придумать другой способ просмотреть список, не опустошая его при этом? Продемонстрируйте ваше решение, заменив необходимые инструкции в программе из примера 1. 3.
Отталкиваясь от программы из примера 6, создайте еще один список, в котором представьте следующие проекты: Проект Срок завершения Разработка базы данных Разработка стандартных писем Разработка объектов СО))<) 780 50 300 Разработка Разработка Разработка Разработка Разработка Разработка Разработка Разработка Разработка Разработка Разработка Разработка компилятора: 35 дней до завершения электронной таблицы: 190 дней до завершения ЯТ1.: 1000 дней до завершения компилятора: 40 дней до завершения компилятора: 35 дней до завершения компилятора: 30 дней до завершения компилятора: 25 дней до завершения компилятора: 20 дней до завершения компилятора: 15 дней до завершения компилятора: 10 дней до завершения компилятора: 5 дней до завершения компилятора: 0 дней до завершения Самоучитель С++ После создания второго списка выполните сортировку и затем слияние обо- их списков.
Выведите на экран итоговый результат. 14.5. Ассоциативные списки Класс тар поддерживает ассоциативный контейнер, в котором каждому значению соответствует уникальный ключ. По существу, ключ — это просто имя, которое вы присваиваете значению. После того как значение помещено в контейнер, извлечь его оттуда можно с помошью ключа. Таким образом, в самом общем смысле можно сказать, что ассоциативный список представляет собой список пар ключ/значение.
Преимушество ассоциативных списков состоит в возможности получения значения по данному ключу. Например, используя ассоциативный список, можно хранить имена телефонных абонентов в качестве ключей, а номера телефонов в качестве значений. Ассоциативные контейнеры в программировании становятся все более и более популярными. Как уже упоминалось, в ассоциативном списке можно хранить только уникальные ключи. Дублирования ключей не допускается. Для создания ассоциативного списка с неуникальными ключами используется класс-контейнер пп)П)в)ар.
Ниже представлена спецификация шаблона для класса тар: Ееар1аЕе<а1азз Кеу, с)аяя Т, с)аяя Сокр = 1езз<Кеу>, с1аяя Л))оса(ог = а11осаЕок<т»с1азз гпар Здесь Кеу — это данные типа ключ, Т вЂ” тип данных, предназначенных для хранения (в карте), а Сов)р — функция для сравнения двух ключей, которой по умолчанию является стандартная обьект-функция )еаза. Ключевое слово АПоса(ог задает распределитель памяти (которым по умолчанию является а Носа(ог).
В классе тар определены следуюшие конструкторы: ехр11сгп вар (сопяп с'отр ЙФ ораза ~ Сонр(), сопяп М1осапог яа = А11ооагок() ); юар (сопяя нар<Кеу, Т, Совр, А11оааЕок>йооъекз) ) Ееер1аге<о1азз 1п? Век>нар (Ха1Еек начало, 1п1 Век конец, собес Совр ьз сраан = Ссцар(), сопяс Ы1осяпог йа = А11ооаЕок () ) Первая форма представляет собой конструктор пустого ассоциативного списка. Вторая форма конструктора предназначена для ассоциативного списка из одинаковых элементов, каждый из которых — это обьект.