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

1 ... 81 82 83 [ 84 ] 85 86 87 ... 239


Перестановка элементов функцией iter swap

простая вспомогательная функция iter swap() меняет местами элементы, на которые ссылаются два итератора:

#1nclude <algor1thni>

void 1ter swap (Forwardlterator posi, Forwardlterator pos)

О Меняет местами элементы, на которые ссылаются итераторы posi и pos2.

О Итераторы не обязаны относиться к одному тину. Тем не менее значения должны быть совместимы по присваиванию.

Простой пример использования функц1П1 iter swap() (функция PRINT ELEMENTS() представлена на с. 128):

1ter/swapl.cpp #include <1ostrea[ii> #include <list> #1nclude <algor1thni> #1nclude print.hpp using namespace std:

int mainO {

list<int> coll:

Вставка элементов со значениями от 1 до 9 for (int i=l: 1<=9: ++i) { coll.push back(i);

PRINT ELEMENTS(coll):

Перестановка первого и второго значений iter swap (coll.beginO. ++со11 .beginO):

PRINT ELEMENTS(coll):

Перестановка первого и последнего значений iter swap (coll.beginO. --coll.endO):

PRINT ELEMENTS(coll):

Результат выполнения программы выглядит так:

123456789 213456789 9 1 3 4 5 6 7 8 2

Учтите, что с векторами эта программа обычно не работает. Дело в том, что операции ++cotl.begin() и ~coll.end() выполняются с временными указателями (дополнительная информация на эту тему приведена на с. 264).



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

В этом разделе рассматриваются итераторные адаптеры - специальные итераторы, позволяющие выполнять алгоритмы, которые поддерживают перебор элементов в обратном порядке, режим вставки и потоки данных.

Обратные итераторы

Обратные итераторы - адаптеры, переопределяющие операторы ++ и - так, что перебор элементов производится в обратном направлении. Следовательно, при использовании этих итераторов вместо обычных алгоритмы обрабатывают элементы в обратном порядке. Все стандартные контейнерные классы позволяют использовать обратные итераторы для перебора элементов. Рассмотрим следующий пример:

iter/reviterl.cpp #1nclucle <1ostream> #include <list> #1nclude <algorithfii> using namespace std:

void print (Int elem) {

cout elem ;

Int maInO {

list<int> coll:

Вставка элементов со эначенияни от 1 до 9

for (int 1=1; 1<=9; ++1) (

coll.push back(i):

Вывод всех элементов в нормапьном порядке for each (coll,beginO. coll.endO. Интервал print); Операция

cout endl:

Вывод всех элементов в обратном порядке for each (coll ,rbegin(). coll.rendO. Интервал print): Операция

cout endl;

Функции rbeginO и rend() возвращают обратный итератор. По аналогии с функциями begin() и end() эти итераторы определяют набор обрабатываемых элемен-



TOD в виде полуоткрытого интервала, однако они производят перебор в обратном направлении:

О rbeginO возврашает позицию первого элемента при обратном переборе (то есть позицию последнего элемента контейнера);

О rend() возвращает позицию за последним элементом при обратном переборе (то есть позицию перед первым элементом контейнера).

Итераторы и обратные итераторы

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

1ter2/rev1ter2.cpp #lnclucle <iostream> #inclucle <vector> #include <algorithm> using namespace std:

lnt mainO {

vector<lnt> coll:

Вставка элементов со эначениями от 1 до 9 for (int i=l: 1<=9; ++1) { coll,push back(i);

Поиск позиции элемента со значением 5 vector<1nt>:riterator pos: pos - find (coll.beginO. coll.endO. 5);

Вывод значения, на которое ссылается итератор pos cout pos: *pos endl:

Преобразование итератора в обратный итератор rpos vector<lnt>::reverse iterator rpos(pos);

Вывод значения, на которое ссылается обратный итератор rpos cout rpos: *rpos endl:

Программа выводит следующий результат:

pos: 5 rpos: 4

Итак, если вывести значение, на которое ссылается итератор, а затем преобразовать итератор в обратный, значение изменится. И это не ошибка - так



1 ... 81 82 83 [ 84 ] 85 86 87 ... 239

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