Шаг 221.
Библиотека STL. Итераторы STL. Итераторные адаптеры. Итераторы и обратные итераторы (окончание)

    На этом шаге мы закончим изучение этого вопроса.

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

//---------------------------------------------------------------------------

#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. Результат работы приложения

    Итак:

    Конечно, константные итераторы преобразуются к типу const_reverse_iterator.

    На следующем шаге мы рассмотрим преобразование обратных итераторов в обычные функцией base.




Предыдущий шаг Содержание Следующий шаг