На этом шаге мы закончим изучение этого вопроса.
Вам непонятен смысл такого преобразования? У него есть свои достоинства: например, вам ничего не придется делать при преобразовании интервала, заданного двумя итераторами. Все элементы остаются действительными. Рассмотрим следующий пример:
//--------------------------------------------------------------------------- #include <vcl.h> #include <iostream> #include <iterator> #include <deque> #include <algorithm> #include <conio.h> //необходимо для getch() #pragma hdrstop //--------------------------------------------------------------------------- #pragma argsused using namespace std; std::string ToRus(const std::string &in) { char *buff = new char [in.length()+1]; CharToOem(in.c_str(),buff); std::string out(buff); delete [] buff; return out; } void print (int elem) { cout << elem << ' '; } int main(int argc, char* argv[]) { deque<int> coll; // Вставка элементов от 1 до 9 for (int i=1; i<=9; ++i) { coll.push_back(i); } // Поиск позиции элемента со значением 2 deque<int>::iterator pos1; pos1 = find (coll.begin(), coll.end(), // Интервал 2); // Значение // Поиск позиции элемента со значением 7 deque<int>::iterator pos2; pos2 = find (coll.begin(),coll.end(), // Интервал 7); // Значение // Вывод всех элементов в интервале [pos1,pos2) cout << ToRus("Вывод всех элементов в интервале [pos1,pos2):\n"); for_each (pos1, pos2, // Интервал print); // Операция cout << endl; // Преобразование итераторов в обратные итераторы deque<int>::reverse_iterator rpos1(pos1); deque<int>::reverse_iterator rpos2(pos2); // Вывод всех элементов интервала [pos1,pos2) в обратном порядке cout << ToRus("Вывод всех элементов интервала [pos1,pos2) в обратном порядке:\n"); for_each (rpos2, rpos1, // Интервал print); // Операция cout << endl; getch(); return 0; } //---------------------------------------------------------------------------
Итераторы pos1 и pos2 определяют полуоткрытый интервал, в который входит элемент со значением 2, но не входит элемент со значением 7. Когда итераторы, определяющие этот интервал, преобразуются в обратные итераторы, интервал остается действительным и может быть обработан в обратном порядке. Результат выполнения программы выглядит так:
Рис.1. Результат работы приложения
Итак:
контейнер::reverse_iterator(end())
контейнер::reverse_iterator(begin())
Конечно, константные итераторы преобразуются к типу const_reverse_iterator.
На следующем шаге мы рассмотрим преобразование обратных итераторов в обычные функцией base.