Шаг 222.
Библиотека STL. Итераторы STL. Итераторные адаптеры. Преобразование обратных итераторов в обычные функцией base

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

    Обратный итератор можно снова преобразовать в обычный. Для этой цели обратные итераторы поддерживают функцию base():

namespace std {
  template <class Iterator> class reverse_iterator ... 
  {
    .    .    .    .    .
    Iterator base() const;
    .    .    .    .    .
  };
}

    Пример использования base():

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

#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;
}

int main(int argc, char* argv[])
{
  list<int> coll;

  // Вставка элементов от 1 до 9 
  for (int i=1; i<=9; ++i) {
    coll.push_back(i); 
  }

  // Поиск позиции элемента со значением 5 
  list<int>::iterator pos;
  pos = find (coll.begin(), coll.end(),  // Интервал
               5); // Значение

  // Вывод значения элемента
  cout << ToRus("Значение элемента pos: ") << *pos << endl;

  // Преобразование итератора в обратный итератор 
  list<int>::reverse_iterator rpos(pos);

  // Вывод значения элемента, на который ссылается обратный итератор 
  cout << ToRus("Значение элемента, на который ссылается обратный итератор rpos:" )
       << *rpos << endl;

  // Преобразование обратного итератора в обычный 
  list<int>::iterator rrpos; 
  rrpos = rpos.base();

 // Вывод значения элемента, на который ссылается итератор 
  cout << ToRus("Значение элемента, на который ссылается итератор rrpos: ") 
       << *rrpos << endl;

  getch();
  return 0;
}

//---------------------------------------------------------------------------
Текст этого примера можно взять здесь.

    Результат выполнения программы выглядит так:


Рис.1. Результат работы приложения

    Преобразование *rpos.base() эквивалентно преобразованию обратного итератора. Иначе говоря, физическая позиция (элемент, на который ссылается итератор) сохраняется, а логическая позиция (значение элемента) перемещается.

    Со следующего шага мы будем знакомиться с итераторами вставки.




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