|
Программирование >> Инициализация объектов класса, структура
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 (о нем рассказывается в разделе
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |