|
Программирование >> Операторы преобразования типа
Перестановка элементов функцией 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 Итак, если вывести значение, на которое ссылается итератор, а затем преобразовать итератор в обратный, значение изменится. И это не ошибка - так
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |