Г. Шилдт - Полный справочник по C++ (1109478), страница 94
Текст из файла (страница 94)
В1пс1ис[е <уоэегеазк> Ззпс1ис)е <чесеог> В1пс1ис)е <ссеуре> иэ1по пашеэрасе эсс[з 1пс ша1п[) ( чессот<спат> ч[10); // создаем вектор из 10 элементов. 1пс 1з // Выводим на экран исходный размер вектора ч соие « "Размер = " « ч.эьте<) « ел<[1[ // Присваиваем элементам вектора определенные значения. бог<1=0[ з.<10[ з.++) ч[з.) = з.
+ 'а'з // Выводим на экран содержимое вектора. соил « Текущее содержимоез[п"з Кот(з=бз 1<ч.эйке()з з++) соис « ч[з.) « соил « "[п(п" з соне « "Расширенный вектор<с"1 /* Эаписьзэаем э кснеи вектора новые элементы, при этом Часть П. Язык С++ гвквгвпсв срвтвког [) <взте курв з) сопаез сосне тееегепсе орегвеог () (в)лв суре з1[ чо1П рор Ьас[с() з чо1п рпвь ьас[с(сопвс т еьв!) з в1кв Фура вьтв[) сопвЕЗ Возвращает итератор, установленный на первый элемент вектора Удаляет элемент, на который ссылается итератор с Возвращает итератор, установленный на элемент, следуккций за удаленным Удаляет элементы из диапазона, заданного итераторами з[ал и алб.
Возвращает итератор. установленный на элемент, следующий за последним удаленным Возвращает ссылку на первый элемент вектора Вставляет элемент ча1 перед элементом, на которыи сеьщаатся итератср з. Возвращает итератор, установленный на элемент ьв[ Вставляет перед элементом, на который ссылается итератор 1 последсаательнсють элементов, заданную итератсраьм з[шчи ел[[ Возвращает ссылку на элемент, заданный итератором 1 Возвращает текущее количество элементов вектора его размер увеличивается.
*/ Тсг(х=Оз 1<10з 1++) ъ.ризЬ Ьаск(1 + 10 + 'а') // Выводим на экран текущий размер вектора ч. ссис « 'Новый размер = " « ч.ззее() « еп((1/ // Выводим на экран содержимое вектора. ссис « "текущее ссдержимсез 1п"з Тсг(1=0з 1<ч.з1ае()з 1++) ссис « ч[1] « соис « "хп1п"з // Изменяем содержимое вектора. (сг(зяОз з<ъ'.зз.ае()з 1++) ч[1] - "ссиррег(ч11])з ссис « "модифицированное содержимсез 1п"з (ог(1=0/ 1<ч.алле()з з+с) ссис « ч[1] « соис « епд1/ гесигп Оз Результаты работы этой программы приведены ниже. Размер = 10 Текущее содержимое: а Ь с Н е Т О Ь 1 Расщиренный вектор Новый размер = 20 Текущее ссдержимсез а Ь с Н е Т н Ь 1 б )< 1 щ и с р <) г а Модифицированное ссдержимоез А В С Р Е Р С Н 1 Ю К В М Н О Р () К Я Т Рассмотрим эту программу внимательнее.
В функции зааТпО создается вектор символов ч, длина которого равна 10. Этот факт подтверждается вызовом функции- члена а1ве(). Затем 1О элемегпов вектора ч инициализируются символами, начиная с буквы а и заяершая буквой ~. Обратите внимание на то, что при этом применяется стандартная индексация. Затем с помощью функции риаЬ Ьасн() в конец вектора ч добавляется еще 10 элементов. Для того чтобы записать зги 10 элементов, размер вектора ч увеличивается. Как свидетельствуют результаты работы программы, после этой операции размер массива становится равным 20. В итоге значения элементов вектора ч изменяются, причем для доступа к ним используется стандартная индексация, В этой программе есть еще один интересный момент.
Обратите внимание на то, что циклы, отображающие на экране содержимое массива ч, используют в качестве верхнего прелела значение функции ч.а1аа(). Одно из преимушеств векторов над обычными массивами заключается в том, что текущий размер вектора можно определить в любой момент. Легко убедиться, что это свойство оказывается довольно полезным во многих ситуациях. Доступ к элементам вектора с помощью итератора Как известно, массивы и указатели тесно связаны между собой.
Доступ к элелзентам массива осуществляется либо через указатель, либо по индексу. В библиотеке БТ]. наблюдается аналогичная ситуация, только роли массивов и указателей играют векторы и итераторы. Доступ к элементам вектора обеспечивается по индексу либо через итератор. Рассмотрим соответствующий прилзер. Глава 24.
Введение в стандартную библиотеку шаблонов // доступ к элементам вектора с помощью итератора. афпс1иг)е <фовсгеащ> аьпс1пде <чесхог> $1пс1пде <ссеуре> овтпд пащеврасе вгг)г ?пе вази() ( чесеог<сиаг ч(10)з // Создаем вектор из 10 элементов. чесгог<снах>ззьпехаеог рз // создаем итератор. зпе з.з // Присваиваем элементам вектора определенные значения. р = ч.Ьед1п(); 1 = Оз ип?1е(р != ч.епг)()) *р = 1 + 'а*з )з++ з 1++; ) // Выводим содержимое вектора на экран. соне « "Исходное содержимоез)п"з р = ч.
Ьедз.п ( ) г мб?1е(р != ч.еп<)() ) соне « *р « р++' ) соне « ")п1п" г // Изменяем содержимое вектора. р = ч.Ьедап()з мп?1е[р )=- ч.еп<?О ) ( *р = еоиррег(*р)з р*+ ) // Выводим содержимое вектора на экран. попс « "Модифицированное содержимое1п"/ р = ъ.Ьедзп() г ьи?1е(р != ч.еп<)О ) [ сонг « *р « р++з соие « епг)1з хееогп Оз Результаты работы этой программы приведены ниже. Исходное содержимоез а Ь с <) е Е д Ь 1 1 Модифидированное содержимоез А В С П Е Р С Н 1 Обратите внимание на то, как объявлен итератор р. Тип 1еегаеог определен в контейнерном классе. Следовательно, чтобы получить итератор для элементов конкрет- Часть Н. Язык С++ ного контейнера„необходимо использовлзь объявление, аналогичное показанному в примере: просто указывать имя контейнера и спецификатор деегаеог.
В данной программе итератор р установлен в начало вектора. Для этого используется функция Ьендп(). Зтэ процедура аналогична применению указателей для доступа к элементам массива. Для того чтобы распознать конец вектора, вызывается функщи епо(). Эта функция возвращает итератор„установленный на элемент, следующий за последним элементом вектора. Таким образом„если итератор р равен значению ч.езжт(), значит, обнаружен конец векзсра. Вставка и удаление элементов вектора Итак, мы уже знаем, как вставить новые значения в конец вектора. Теперь посмотрим, как их записать в середину. Для этого применяется функция 1пвеге(). удалить элементы из вектора можно с помощью функции агаве(). рассмотрим программу, иллюстрирующую применение функций 1пвеге() и агаве().
// Иллюстрация функций ъпвегс и егаве. Втпс1цг)е <ьовегешп> М1пс1це)е <чессог> цвтпд паюеэрасе эс<)з з.пс па1п() ( чесеог<снаг> ч(10); чессог<снаг> ч2з снаг нег[] = "<чесеог>"з 1пс зз // Инициализируем вектор ч. тог(1=0з 1<10; 1++) ч[1) - "1 + 'а' // Копируем символы иэ строки всг в вектор ч2. Еог(ъ=оз всг[к]з з++) ч2.рцвн Ьас)с(всг[з.))з // Выводим на экран исходное содержимое вектора соцс « "Исходное содержимое вектора чз1п"з гог(1=0„. з<ч.въле()з 1++) соцс « ч[].] « соцс « ")п1п"з зессог<сьаг>з.1еегасог р = ч.Ьеоуп()з р += 2з // Устанавливаем итератор на третий элемент. // Вставляем 10 символов 'Х' в вектор ч. ч.тпэеге(р, 10, "х')з // Выводим иа экран содержимое вектора после вставки. соце « "Размер вектора после вставки символов 'Х' « ч.в1ке() « епд1з соцс « кдодержимое вектора ч госле вставки:'зп'з гог(1=0; 1<ч.въее()з 1++) соцс « ч[).] « соцс « "1п'зп" з // Удаляем эти элементы.
р = ч.Ьедтп () з р += 2/ // Устанавливаем итератор на третий элемент. ч.егаве(р, р+10)з // Удаляем следующие 10 элементов. // Выводим на экран содержимое вектора после удаления. Глава 24. Введение в стандартную библиотеку шаблонов соне « "Размер вектора ч после удаления = « ч.зьге[) « епб1) соус « "Содержимое вектора ч после удаленияг хо"г гог(1=0; 1<ч.вьге(]; 1++) сопс « ч[1) « " "р соис « "1Мп") // Вставка вектора ч2 в вектор ч. ч.зпвегс(р, ч2.Ьедьп(), ч2.епбО )г сове « "Размер вектора ч после вставки вектора ч2 сонг « ч.в№ге() « епд1; соус « "Содержимое вектора ч после вставки> хп") гог(1=ОЙ 1<ч.вгае(]) 1++) соис « ч[1) « " "р сопс « епб1) геспгп Оу Эта программа выводит на экран следующие строки.
Исходное содержимое вектора ч: а Ь с с) е Г д Ь 1 Размер вектора после вставки символов 'Х' = 20 Содержимое вектора ч после вставки: а Ь Х Х Х Х Х Х Х Х Х Х с б е Г д Ь [ Размер вектора ч после удаления = 10 Содержимое вектора ч после удаления: а Ь с б е № д Ь Ь 2 Размер вектора ч после вставки вектора ч2 = 18 Содержимое вектора ч после вставки: а Ь < Ч е с с о г > с с] е г д Ь [ Зта программа демонстрирует применение двух видов функции 1паеге() . В первом случае она вставляет в вектор 10 символов 'х'. Во втором — вставляет в вектор ч содержимое вектора чл. Вторая форма функции Апвеге() намного интереснее. Она имеет три аргумента, которые являются итераторами. Первый из них залает позицию, с которой начинается вставка элементов в контейнер.
Следующие два аргумента залают начало и конец вставляемой последовательности Вектор, содержащий объекты класса В предыдуших примерах вектор содержал обьекты встроенных типов, однако класс чеоеог облалает более широкими возможностями. Вектор может состоять из объектов любого типа, акзючая обьекты классов, опрелеленных программистом.
Рассмотрим пример, в котором вектор хранит данные о температуре воздуха, измеренной в течение недели. Обратите внимание на то, что класс г)а11утеа(з имеет конструктор по умолчанию, а также перегруженные версии операторов "<" и "= ". Помните, что в зависимости от конкретной реализации библиотеки ЯЧ. перегрузка операторов сравнения может быль необязательной. // Вектор, содержаний объекты класса. №ьпс1ибе <1овегеат> №ьпс1пбе <чессог> №ьпс1пбе <све<)1й» пвлпд патеврасе всб) с1азв Ва11утегпр Ьпс се)ар) Часть 11. язык С++ роЬ11с: Ра11утевр() ( Совр = 0; ) Ра11уТевр(апг х) ( Севр = х; ) Ра11уТевр Ьорегагог=(апг х) Севр = х; гегигп *СЬТа; ) с)оиЬ1е дег Севр() ( геспгп Севр; ) ): Ьоо1 орегагог< (Ра11уТевр а, Ра11утевр Ь) ( геспгп а.дес севр() < Ь.дес севрО; ) Ьоо1 орегагог==(Ра11уТевр а, Ра11уТевр Ь) ( гегогп а.дег СеврО == Ь.дет Секр()3 Тпс ва1п(! ( чесоог<Ра11уТевр> ч; ьпт 1; ТОГ(1=0; 1<7; 1<+) ч.ровЬ Ьасн(па11уТевр(50 + гапсЪ()%30)); соус « Температура ло Фаренгейтуь уп"; Тот(1=0; 1<ч.е1ге(); 1++) сонг « ч[1).дес севр() « сонг « еп01; // Преобразование шкалы Фаренгейта в шкалу цельсия.