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

1 ... 30 31 32 [ 33 ] 34 35 36 ... 239


Итераторные адаптеры

Итераторы являются чистыми абстракциямщ иначе говоря, любой объект, кото- \ рый ведет себя как итератор, является итератором. По этой причине вы можете ] написать класс, который обладает интерфейсом итератора, но делает нечто совершенно иное. Стандартная библиотека С++ содержит несколько готовых специализированных итераторов, называемых итераторными адаптерами. Не стоит полагать, что итераторные адаптеры являются обычными вспомогательными классами; они наделяют саму концепцию итераторов рядом новых возможностей.

В следующих подразделах представлены три разновидности нтераторных адаптеров:

О итераторы вставки; О потоковые итераторы; О обратные итераторы.

Дополнительная информация приводится на с. 270.

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

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

Поведение итераторов вставки слегка переопределено.

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

О Операция перехода вперед не производит никаких действий.

Рассмотрим следующий пример:

stl/соруЗ.срр Iinclude <iostrea[n> finclude <vector> #include <list> #include <deque> Iinclude <set> Iinclude <algorith[n> using namespace std:

Int mainC) {

list<int> colli:

Вставка элементов со значениями от 1 до 9 в первую коллекцию



for (int i=l; 1<=9: { colli.push back(1):

Копирование элементов из colli в coll2 с присоединением vector<int> col 12:

copy (col 11.beginO. colU.endO. Источник back inserter(coll2)): Приемник

Копирование элементов colli в соИЗ со вставкой в начало - порядок следования элементов заменяется на противоположный deque<int> col 13:

copy (colU.beginO. colli.endO. Источник front inserter(coll3)}: Приемник

Копирование элементов colli в coll4 - единственный итератор вставки, работающий с ассоциативными контейнерами set<1nt> col 14:

copy (colli.beginO, colli.endO, Источник inserter(coll4.coll4,beginO)): Приемник

В этом примере встречаются все три разновидности итераторов вставки.

О Конечные итераторы вставки. Элементы вставляются в конец, контейнера (то есть Присоединяются) вызовом push back(). Например, следующая команда присоединяет все элементы colli к со112:

сору (colU.beginO. colli.endO. Источник back 1nserter(coll2)): Приемник

Разумеется, конечные итераторы вставки могут использоваться только с контейнерами, поддерживающими функцию push back(). В стандартной библиотеке С++ такими контейнерами являются векторы, деки и списки.

О Начальные итераторы вставки. Элементы вставляются в начало контейнера вызовом push front(). Например, следующая команда вставляет все элементы colli в соНЗ:

сору (colU.beginO. colli.endO. Источник front inserter(coll3)): Приемник

Помните, что данная разновидность вставки меняет порядок следования элементов. Если вставить в начало значение 1, а затем значение 2, то 1 окажется после 2.

Начальные итераторы вставки могут использоваться только с контейнерами, поддерживающими функцию push front(). В стандартной библиотеке С ++ такими контейнерами являются деки и списки.

О Унифицированные итераторы вставки. Унифицированный итератор вставки, также называемый просто итератором вставки, вставляет элементы непосредственно перед позицией, переданной во втором аргументе при ттициализации.



Он вызывает функцию insert() и передает ей значение и позицию нового элемента. Вспомните, что все контейнеры, определенные в STL, поддерживают функцию insert(); это единственный итератор вставки в ассоциативных контейнерах.

Стоп! Но ведь выше говорилось, что задать позицию нового элемента в ассоциативном контейнере невозможно, потому что позиции элементов зависят от их значений? Все просто; в ассоциативных контейнерах переданная позиция интерпретируется как рекомендшщя для начала поиска нужной позиции. Однако если переданная позиция окажется неверной, на выполнение операции может понадобиться больше времени, чем вообше без рекомендации. На с, 291 описан пользовательский итератор вставки, более удобный при работе с ассоциативными контейнерами,

В табл, 5.1 перечислены разновидности итераторов вставки, а дополнительная информация приводится па с. 275.

Таблица 5.1. Стандартные итераторы вставки

Выражение Разновидность итератора

back inserter Элементы присоединяются с конца в прежнем порядке с использованием

(контейнер) функции push back()

frontjnserter Элементы вставляются в начало в обратном порядке с использованием

(контейнер) функции pu5h front()

inserter (контейнер, Элементы вставляются в заданной позиции в прежнем порядке

позиция) с использованием функции insert()

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

Потоковые адаптеры составляют етце одну чрезвычайно полезную разновидность итераторпых адаптеров. Под этим термином понимаются итераторы, обеспечивающие чтение из потока данных и запись в поток данных. Иначе говоря, потоковые итераторы позволяют интерпретировать ввод с клавиатуры как коллекцию, из которой можно читать данные. Аналогично, вы можете перенаправить результаты работы алгоритма в файл или на экран.

Рассмотрим типичный пример, убедительно подтверждающий возможности STL. По сравнению с чистой реализацией С или С-ь+ эта программа выполняет довольно большой объем работы всего в нескольких командах;

stl/1oiterl.cpp Iinclude <iostream> Iinclude <vector> Iinclude <str1ng> Iinclude <algorithm> using narnespace std;

Потоками данных называются объекты, представляющие каналы ввода-вывода (см, главу 13).



1 ... 30 31 32 [ 33 ] 34 35 36 ... 239

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