Г. Шилдт - Полный справочник по C++ (1109478), страница 128
Текст из файла (страница 128)
Возвращается итератор, установленный на искомый элемент. Вторая версия позволяет програмл1исту самостоятельно задавать Функцию сравнения, определяющую критерий поиска. р76 Часть й(. Библиотека стандартных классов теслр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еет еи), хеха)Г, ВхпРхес( р)п); 8 этой главе описываются классы и функции, обеспечивающие работу с итераторами, распределителями памяти и функторами. Эти компоненты являются частью стандартной библиотеки шаблонов. Следует заметить. что эти функции можно примеггять и дги решения друг.их задач. !Й Итераторы Основные типы итераторов Существуют пять лилов итераторов.
Итерапзр Вид доступа Итератор произвольного доступа Хранит и извлекает значения. Обеспечивает произвольный доступ к зпемеитам, Хранит и извлекает значения. Перемещается вперед и назад. Хранит и извлекает значения. Перемещается только вперед. Извлекает, но не хранит элементы. Перемещается только вперед. Хранит, но ие извлекает значения.
Перемещается только вперед. Двунаправленный игератор Прямой итерагор Игератор ввода Игератор вывода Как правило, итераторы, обладаюгцие более широкими возможностями„можно использовать вместо более слабых итераторов. Например, влгесто итератора ввода можно применять прямой итсратор. В библиотеке БТЕ существуют также обралгггые иглераторы (геуегзе йегагог). Они могут быть либо двунаправленными, либо итераторами произвольного доступа.
В обоих случаях они должны иметь возможность перемешаться по контейнеру в обратнолг направлении. Таким образом, если обратный итератор ссылается на конец последовательности, его увеличение приведет к перегиешению на предыдущий элемент. Кроме них существуют еше два вилл итераторов.
Потоковые итераторы позволяют перемешаться по потоку. Итераторы вставки упрощают вставку элементов в контейнер. Все итераторы должны поддерживать операции над соответствуюгцими указателями. Например, класс итераторов ввола должен предуслгатривать операции ->, ++, == и з=. Кроме того, для присвоения значений нельзя применять оператор "*". В отличие от итераторов ввода, итератор произвольного доступа должен поддерживать операции ->, +„++, -, --,, <, >, <и, >уч -=, +и, ==, з= и (). б?8 Часть 1)ь Библиотека стандартных классов Если контейнеры и алгоритмы образуют фундамент стандартной библиотеки шаблонов, то итераторы представляют собой цемент, связываюшии их в одно целое.
Илгератор (йсгатог) — это обобщение (точнее, абстракция) указателя. Итераторы функционирукп подобно указателям и реализуют стандартные операции над ними. Они позволяют перемешаться по солсржимому контейнера так жс, как указатель перемешается по элсмситам массива. Стагшарт языка С++ предусматривает набор классов и функций, обеспечивающих работу с итерггорами. Однако в подавляющем большинствс задач программирования, требующих применения стандартной библиотеки шаблонов, эти классы и функции непосредственно не используются. Вместо них применяются итераторы, связанные с разнообразными контейнерами и выполцяюшие в них роль указателей, Тем не менее программист должен хорошо разбираться в принципах организации классов, реализующих итераторы, и понимать, как они устроены.
Например, может возникнуть необходимость разработать свои собственный итератор, прелназначенныи для конкретной ситуации. Кроме того, итераторы могут оказаться полезными при разработке независимых библиотек. Итераторы используют заголовок <зеекееок>. Классы низкоуровневых итераторов В заголовке <1овекеахп> опрслсле~ю несколько классов. обеспечивающих поллержку итераторов. Как указывалось в главе 24, кажлыи стаплартиый коцтейпер определяет свой собствспшый тип итератора хеекаеох с помощью оператора еурехтех.
Таким образом, используя стаплартпые коцтейпсры, програылхисты обычно пе применяют пизкоуровисвые классы итсраторов. Однако классы, описанные иижс, могут пригодиться программистам при разработке своих собствеппых итсраторов. В некоторых классах итсраторов используется тип рехе111 е. Этот тип позволяет представить разность между лвугмя указателями. Класс Нега1ог Класс 1еехаеох является базовым лля всех итераторов. Вот как ои выглялпт. Семр1аее <с1авв Сап, с1авв Т, с1авв Пхве = рек<(111 С, с1авв Рохпеех = Т * с1авв Реб = Т а> вккисе хкекаеок ( Сурейег Т иа1ие Суре; Сурейег Пхве <(111екепсе Суре; сурейег Роз опек рохгкек; Сурейег лег хегекегсе; суре<(ег Сас 1еекакок саеедоку; Здесь тип <11елехеасе туре позволяет крапить раз|щеть между лвумЯ адресами, тип ча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секасох::с(111ехепсе суре о111ехегсе суре; Суре<(ег 1еехакок:гуа1ие Суре иа1ие Сурег Сурейег 1еекакох::рохоеех ронтвек; СурейеХ 1кекаеок::кевекепсе хегекепсе; сурейег теехасок::хсекаеок сасевоку хеехасох сасесоху; Встроенные итераторы Заголовок <1еехаеок> содержит несколько встроенных итераторов, которые можно применять как непосредственно, так и лля созлааия других итсраторов. Эти итера- торы перечислены в табл. 35.!. Обратите впимапис иа то, что в заголовке прслусмот- 679 Глава 35.
Стаидартиые итераторы, распределители памяти и функторы репы четыре потоковых итсратора. Они позволяют алгоритмам манипулировать пото- ками. Кроме того, заслуживают внимания итсраторы ввода. Если эги итсраторы ис- пользуются в опсраторс присваивания, они вставляют элементы в послслоаатсльцосгь, а не перезаписывают сс содержимое. Таблица 35/Е Встроенные итераторы зяввхх Ьввхвхвх Ьве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пвегс 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ыс)е <чесгог> ивзлд паюеарасе вгг); Часть й/.