Программирование >>  Операторы преобразования типа 

1 ... 77 78 79 [ 80 ] 81 82 83 ... 239



Итераторы STL

Заголовочные файлы итераторов

Каждый контейнер сам определяет типы своих итераторов, поэтому для работы с итераторами контейнеров специальные заголовочные файлы не нужны. Тем не менее существует несколько снециашных итераторов (например, обратных), которые определяются в заголовочном файле <iterator>, хотя этот файл напрямую включается в профаммы довольно редко. Он используется контейнерами для определения типов обратных итерато]Х)в н обычно подгружается ими автоматически.

Категории итераторов

Итератором называется объект, предназначенный для постедовательного перебора элементов. Перебор осуществляется через единый интерфеГтс, основой для которого стал интерфейс обычных указателей (общие сведения об итераторах приводятся на с. 96). Итераторы подчиняются принципу чистой абстракции, то есть любой объект, который ведет себя как итератор, является итератором. Тем не менее итераторы обладают разными свойствами; иногда это очень существенно, поскольку для работы некоторых алгоритмов тшобходимы особые свойства итераторов. РТапрнмер, для алгор1ггмов сортировки нужны итераторы произволыю-го доступа, поскольку без них эффективность алгорнтлюв была бы слишком низкой. Из-за этого итераторы делятся на несколько категорий (рис. 7.1). В табл. 7.1 приведены краткие характеристики этих категорий.

Таблица 7.1. Характеристики категорий итераторов

Категория

Возможности

Поддержка

Итератор ввода

Чтение в прямом направпении

Потоковый итератор ввода

Итератор вывода

Запись в прямом направлении

Потоковый итератор вывода.

итератор вставки

В исходной версии STL заголовочный файл итераторов назывался <itcrator.h>.



Таблица 7.1 (продолжение)

Категория

Воэможности

Поддержка

Прямой итератор

Двунаправленный итератор

Итератор

Чтение и запись в прямом направлении

Чтение и запись в прямом и обратном направлениях

Чтение и запись

произвольного доступа с произвольным доступом

Списки, множества, мультимножества, отобрвжения, мультиотображения

Вектор, дек, строка, массив

Итератор ввода

Итератор вывода

Прямой итератор

Двусторонний итератор

Итератор произвольного доступа

Рис. 7.1. Категории итераторов

Итераторы ввода

Итератор ввода перемещается только вперед и поддерживает только чтение (то есть возвращает значения элементов в порядке их перебора). В табл. 12 перечислены операции итераторов ввода.

Таблица 7.2. Операции итераторов ввода

Выражение

Описание

*iter

lt3er-> member

++lter

it3er++

iterl Iter2 Iterl Ы iter2 TYPE(iter)

Обращение к элементу

Обращение к переменной или функции элемента Смещение вперед (возвращает новую позицию) Смещение вперед (возвращвет старую позицию) Проверка двух итераторов на равенство Проверка двух итераторов на неравенство Копирование итератора (копирующий конструктор)

Итератор ввода читает элементы только один раз. Если скопировать итератор ввода и выполнить <1тение через оригинал и копию, вы можете получить разные значения.



Практически любой итератор обладает базовыми возможностями итераторов ввода, но большинство итераторов способно на большее. Типичным примером чистого итератора ввода является итератор, читающий данные из стандартного входного потока данных (обычно с клавиатуры). Одно значение не может быть прочитано дважды. После чтения слова из входного потока данных при следующем обращении будет получено другое слово.

Два итератора ввода считаются равными, если они находятся в одной позиции. Однако, как упоминалось выше, это не означает, что при следующем чтении они вернут одно и то же значение.

По возможности используйте префиксный оператор перемещения итератора вместо постфиксного, потому что он может работать более эффективно. Дело в том, что префиксной форме не нужно возвращать старое значение, которое должно храниться во временном объекте. Следовательно, для итератора pos (и любого абстрактного типа данных) рекомендуется использовать префиксный оператор:

++POS правильно и быстро

Префиксный оператор работает быстрее постфиксного:

POS++ Правильно, но не быстро

Это утверждение относится и к оператору - (для тех итераторов, для которых он определен, - итераторы ввода его не поддерживают).

Итераторы вывода

Итераторы вывода составляют пару с итераторами ввода. Они тоже перемещаются только вперед, но выполняют запись. Таким образом, присваивание новых значений выполняется только для отдельных элементов. Итератор вывода не может использоваться для повторного перебора интервала. Запись производится в некую абстрактную черную дыру ; если вы повторно записываете данные в той же позиции в исходную черную дыру , ничто не гарантирует, что они будзгг записаны поверх предыдущих данных. В табл. 7.3 перечислены операции итераторов вывода.

Таблица 7.3. Операции итераторов вывода Выражение Описание

*lter=value Записывает value в позицию, определяемую итератором

++iter Смещение вперед (возвращает новую позицию)

lter++ Смещение вперед (возвращает старую позицию)

TYPE(lter) Копирование итератора (копирующий конструктор)

Обратите внимание: для итераторов вывода операции сравнения не нужны. Вам не удастся проверить, действителен ли итератор вывода и успешно ли состоялась запись . Возможна только запись и ничего более.

На практике итераторы обычно поддерживают как чтение, так и запись. Абсолютное большинство итераторов обладает свойствами итераторов вывода (как



1 ... 77 78 79 [ 80 ] 81 82 83 ... 239

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика