Г. Шилдт - Полный справочник по C++ (1109478), страница 129
Текст из файла (страница 129)
Библиотека стандартных классов Итсраторы вставки предназначены для вставки элементов в контейнер, а не для их замены. Чтобы понять принцип работы итератора вставки, рассмотрим следуюшую программу. Сначала она создаст небольшой вектор, состоящий из целых ~иссл, а затем использует объект класса 1пвегг зевгасог для вставки новых элементов, нс заменяя сушсствуюшис элементы вектора.
гпх таз п() ( чессог<зпс> ч; чесгох<зпх>зззхехасог 1гхз зпх 1; гох(1=0з 1<5( 1+>) ч.рави Ьас)с(з.)з сонг « "Исходный иассивз зхт = ч.Ьедвп()з ыи11е(1сх ! = ч. епс)() ) соус « *ззст++ « соих «егк)1з 1гх =- ч.Ьед1п()з вгх += 2з // Осыпка яа элемент 2 // Оседаем итератор вставки, ссылаоаийся яа элемент 2. зпветс 1сехасох<чессох<1пс» з з.сх(ч, всх.)з // Происходит вставка, а ие замена. >1 1хх++ = 100( *з 1хт+> = 200; соцс « "массив посззе вставки: 1сг = ч.Ьедзо()з иЬ11е(ххт != ч.епп()) соих « *1хх+> « хесихп О," Результаты работы этой программы представлены цижс.
1 Исходный массив: 0 1 2 3 4 массив послс вставкиз 0 1 100 200 2 3 4 Если ли бы лля присвоения элсмснтов !ОО и 200 программа использовала обычный итератор, соответствующие элсмезпы в исходном содержании массива были бы перс- записаны. Работа итсраторов, описанных классами Ьас)с 1пветс хсетасохи атопс 1пветс асетасот, ошювана на тсх жс принципах. Класс Ьас1с ~паег1 Нега1ог Класс Ьас)с 1пветт асетатог ПОЛДсРживает работу итсраторов вывода, вставляющих объекты в конец контейнера с помощью Функции равЬ Ьас)с(). Его шаблонное определение выглядит следующим образом.
1 сеязр1асе <с1авв Солт> с1авв Ьас)с зпвегс хсехасотз роЬ)вс 1хетахох<оцхрых 1хегахог Сад, чохс(, чо1с(, чо1<(, чо1с)> Здесь параметр сопт — это тип контейнера, для которого предназначен итсратор. Класс Ьас)с апветс асетасот имеет слсдузоший конструктор. а ехр11с1С Ьасй хпвегс(сопг Гыяг) Здесь параметр сл/ представляет собой контейнер, для которого предназначен итера- тор. Все вставки выполняются в концс контейнера. Глава 35. Стандартные итераторы, распределители памяти и функторы В классе Ьао)< 1пвеге 1еегаеог определены следующие операторы; "=", "*", "++". Указатель па коптеииер хранится в защищенной псремеш)ой ооаеа1пег. Кроме того, в классе определена функция ьао)х хпвехеег(), создающая объект класса Ьао)т 1пвехе 1еегагох.
Ее спецификация представлена ииже. $ еетр1асе <с1авв сопс> ьаск Хпвехс Хсехахох<сопс> ьаск Хпвехсех(сопс вон); Класс 1гол1 ваег1 Нега1ог Класс кгоае хпвеге 1еегагох полдерживаст работу итсраторов вывода, вставляющих объекты в начало контейнера с помощью функции ривЬ Ягопх(), Его шаблонное опрслслспис выглядит так. сетр1аее <с1авв сопс> с1авв бгопс 1овехх ххехасох: роЫ1с Ххегаеох<оисрие 1сехасох еа9, уо1с), ео1с), еа1(), уогг)> Здесь параметр сове — это тип ко)псщ)сра, лля которого предназначен итератор.
Класс лгопе 1авеге 1еегаеог имеет следу(а(лий конструктор. Б ехр11с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гегасог определен защи[цснный член сиггепг, представляющий собой итсратор. ссылающийся на текущую позицию. Кроме того, в классе ге»гегвя 1сегасог опрелслена функция )»аве(), спецификация которой имеет следующий вид.
Г) Хсех )»аяе() сопла; Она возвращает итсратор, ссылающийся на текущую позицию. Класс Ыгеат Нега1ог Класс 1всгеаа 1сегасог поллсрживаст работу потоковых итсраторов ввода. Его цзаблоннос определение выл лялит слсдующим образом. Се»»р1ахе <с1авя Т, с1аяя С)»ахтуре, с1аяя Лххх = снах Схатхя<пбахтуре>, с1аяв рьвх = рххй1гб С> с1аяв Тяхгея»п 1хехахох: ри)»11с 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иг)е <1ояххеая> $1пс1п([е <асехасох> пя1пд пап~еярасе ясг)г тпх яа»п[) 1ясхеага 1сехасох<сьаг> 1п 1с(с1п) с)о ( сопх « *1п 1С++» ) и)»11е (*1п »а != '.'); гехцхп 0» ) Глава 36. Стандартные итераторы, распределители памяти и функторы Класс [Б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авв свкхеапт 1кекакскт риЫ1с 1хетахох<оисрих 1хекахох пад, ттоЫ, иоЫ, иоЫ, иоЫ> Здесь параметр т — это тип передаваемых данных, а параметр сьагтуре является символьным типом (сьаг или мсьаг г), которым оперирует поток.
Класс овггеаа вхагахог имсст следующие конструкторы. | овххеапт Тхекакок(овхгеаа суре амгеат)т овххеатп Тхегахок(овхгеатп суре ьмгеат, сапах спахтуре "т(е)тт) т овккеат 1кекакок(сипак овхкеаа 1хехахсх<Т, СЬакТуре, Аккх> ЬаЫ Первый создаст итсратор, ссылающийся на поток зггеат. Тип овьгеап суре определяется опсратором сурет[ел и задает тип потока вывода. Второй конструктор создаст итсратор, ссылающийся на поток з(геат, используя в качестве разделителя символ Часть йй Библиотека стандартных классов Неlип, который записывается в поток после каждой операпии вывода.
Третий вил конструктора созлает коп)ию объекта класса онскена ).сегасог. В классе овсгеат (.сагасох опрслелсны следующие операторы: "=", """, "++" Рассмотрим нсбольшу»о программу, иллюстрирующую работу класса овскеюа 1сегасог. /»' Применение класса овхкеам 1хегахок. $1сс1иг)е <1овхгеам> ятсс1ис)е <»Сегахох> ив1пд саа»еврасе асб» 1сс та».а() овхкеат 1кехаког<снах» осс 1с(сагах) *оих ».С = 'Х' оык 1С++» *оис 1с = 'у' оис 1сх ь» *омс».с сиаг век() = Итераторы — ионный ь»нструмент. тп"» снах "р = вхх» ИЫ1е(*р) *оох 1С++ = *р++» овхкеаг» 1хекахок<с)омЬ1е> оох с)оиЬ1е 1С(соих)» *оок с)ооЬ1е »С = 127.23» огас с)оиЫе 1с++» *оак с)омЫе хх .—. -102.7» хесохс 0; ) Результаты раб(вы зтои программы привелены ниже.
ХХ Итераторы- моцньгй инструмент. 187.23-102.7 Класс оаЬгеа)т)Ьот йега1ог Класс овсгевва»мя хсекасог поддерживает работу потоковых итсраторов вывода символов. Его шаблонное определение выглядит так. | сел»р1асе <с1авв сиактуре, с1авв Асск = сьак сха?св<сьахтуре» с1авв овскеатлЬиг 1секасок» риЫ1с ксекасог<оасрас,1секасог сад, чоЫ, чоЫ, чоЫ, чоЫ> Здесь параметр сьагтуре является символьным типом (сьаг или мсьаг с),.которым оперирует поток.