Итераторные адаптеры. Итераторы и обратные итераторы (окончание)

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

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

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

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

   
Итак:

  • rbegin() - это просто:
      контейнер::reverse_iterator(end()) 
    
  • rend() - это просто:
      контейнер::reverse_iterator(begin())
    

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

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



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий