На этом шаге мы рассмотрим обратные итераторы.
Начиная с этого шага рассматриваются итераторные адаптеры - специальные итераторы, позволяющие выполнять алгоритмы, которые поддерживают перебор элементов в обратном порядке, режим вставки и потоки данных.
Обратные итераторы - адаптеры, переопределяющие операторы ++ и -- так, что перебор элементов производится в обратном направлении. Следовательно, при использовании этих итераторов вместо обычных алгоритмы обрабатывают элементы в обратном порядке. Все стандартные контейнерные классы позволяют использовать обратные итераторы для перебора элементов. Рассмотрим следующий пример:
//--------------------------------------------------------------------------- #include <vcl.h> #include <iostream> #include <iterator> #include <list> #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[]) { list<int> coll; // Вставка элементов от 1 до 9 for (int i=1; i<=9; ++i) { coll.push_back(i); } // Вывод всех элементов в нормальном порядке cout << ToRus("Вывод элементов в прямом порядке:\n"); for_each (coll.begin(),coll.end(), // Интервал print); // Операция cout << endl; // Вывод всех элементов в обратном порядке cout << ToRus("Вывод элементов в обратном порядке:\n"); for_each (coll.rbegin(),coll.rend(), // Интервал print); // Операция cout << endl; getch(); return 0; } //---------------------------------------------------------------------------
Функции rbegin() и rend() возвращают обратный итератор. По аналогии с функциями begin() и end() эти итераторы определяют набор обрабатываемых элементов в виде полуоткрытого интервала, однако они производят перебор в обратном направлении:
Рис.1. Результат работы приложения
На следующем шаге мы рассмотрим итераторы и обратные итераторы.