Программирование >>  Инициализация объектов класса, структура 

1 ... 83 84 85 [ 86 ] 87 88 89 ... 395


for( ; iter != iter end; ++iter )

Для того чтобы напечатать все элементы вектора, нужно написать:

cout << *iter << \n;

Здесь значением *iter выражения является, конечно, элемент вектора.

В дополнение к типу iterator в каждом контейнере определен тип const iterator, который необходим для навигации по контейнеру, объявленному как const.

#include <vector>

void even odd( const vector<int> *pvec, vector<int> *pvec even, vector<int> *pvec odd )

const iterator необходим для навигации по pvec vector<int>::const iterator c iter = pvec->begin(); vector<int>::const 1terator c iter end = pvec->end();

for ( ; c iter != c iter end; ++c iter ) if ( *c iter % 2 )

pvec even->push back( *c iter );

else pvec odd->push back( *c iter );

const iterator позволяет только читать элементы контейнера:

Что делать, если м1 хотим просмотреть некоторое подмножество элементов, например взять каждый второй или третий элемент, или хотим начать с середины? Итераторы поддерживают адресную арифметику, а значит, мы можем прибавить некоторое число к итератору:

vector<int>::iterator iter = vec->begin()+vec.size()/2; iter получает значение адреса элемента из середины вектора, а выражение

do something with element( *iter ); Объявление итератора выглядит слишком сложным. Вот определение пары итераторов

vector<string> vec;

vector<string>::iterator iter = vec.begin();

вектора типа string:

vector<string>::iterator iter end = vec.end();

В классе vector для определения iterator используется typedef. Синтаксис

vector<string>::iterator

ссылается на iterator, определенный с помощью typedef внутри класса vector, содержащего элементы типа string.



#include <vector> #include <string> #include <iostream>

int main() {

vector<string> svec; string intext; while ( cin >> intext )

svec.push back( intext );

обработать svec ...

копируемым.) Допустим, есть вектор:

Вот как можно определить новые векторы, инициализируя их элементами первого

int main() {

vector<string> svec;

...

инициазация svec2 всеми элементами svec vector<string> svec2( svec.begin(), svec.end() );

инициализация svec3 первой половиной svec vector<string>::iterator it =

svec.begin() + svec.size()/2; vector<string> svec3 ( svec.begin(), it );

...

вектора:

iter += 2; сдвигает iter на два элемента.

Арифметические действия с итераторами возможны только для контейнеров vector и deque. list не поддерживает адресную арифметику, поскольку его элементы не располагаются в непрерывной области памяти. Следующее выражение к списку неприменимо:

ilist.begin() + 2;

так как для перемещения на два элемента необходимо два раза перейти по адресу, содержащемуся в закрытом члене next. У классов vector и deque перемещение на два элемента означает прибавление 2 к указателю на текущий элемент. (Адресная арифметика рассматривается в разделе 3.3.)

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



#include <vector> #include <string> #include <iterator>

int mainQ {

привязка istream iterator к стандартному вводу istream iterator<string> infile( cin );

istream iterator, отмечающий конец потока istream iterator<string> eos;

инициазация svec элементами, считаеми из cin; vector<string> svec( infile, eos );

...

12.4.3) упрощает чтение элементов из входного потока в svec:

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

#include <string> string words[4] = {

stately , plump , buck , mulligan

массив строк: };

Мы можем инициализировать вектор с помощью указателей на первый элемент массива и на элемент, следующий за последним:

vector< string > vwords( words, words+4 ); Второй указатель служит стражем : элемент, на который он указывает, не копируется.

int ia[6] = { 0, 1, 2, 3, 4, 5 };

Аналогичным образом можно инициализировать список целых элементов:

list< int > ilist( ia, ia+6 );

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

Упражнение 6.9

Какие ошибки допущены при использовании итераторов:

Использование специального типа istream iterator (о нем рассказывается в разделе



1 ... 83 84 85 [ 86 ] 87 88 89 ... 395

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