Шаг 236.
Библиотека STL. Итераторы STL. Итераторные адаптеры. Написание унифицированных функций для итераторов. Выбор реализации для функции distance

    На этом шаге мы приведем реализацию функции distance().

    В следующем примере демонстрируется описанная методика выбора реализации в зависимости от типа итератора. Мы рассмотрим реализацию вспомогательной функции distance(), возвращающей расстояние между двумя позициями итераторов и их элементов. Реализация для итераторов произвольного доступа сводится к простому использованию оператора -. Для остальных категорий итераторов возвращается количество операций + + , необходимых для достижения конца интервала.

// Унифицированная реализация функции distance() 
template <dass Iterator>
typename std::iterator_traits<Iterator>::
              difference_type distance (Iterator pos1, Iterator pos2)
{
  return distance (pos1, pos2,
                          std::iterator_traits<Iterator>
                              ::iterator_category());
}

// Реализация функции distance() для итераторов произвольного доступа 
template <class RaIterator>
typename std::iterator_traits<RaIterator>::difference_type 
distance (RaIterator pos1, RaIterator pos2, 
              std::random_access_iterator_tag)
{
  return pos2 - pos1;
}
// Реализация функции distanceO для итераторов ввода, 
// прямых и двунаправленных итераторов 
template <class Inlterator>
typename std::iterator_traits<lnlterator>::difference_type 
distance (InIterator pos1, InIterator pos2, 
              std::input_iterator_tag)
{  
  typename std::iterator_traits<lnlterator>::difference_type d; 
  for (d=0; pos1 != pos2; ++pos1, ++d);
  return d;
}

    Тип разности итераторов используется как тип возвращаемого значения. Обратите внимание: во второй версии указан тег итераторов ввода, поэтому реализация автоматически используется прямыми и двунаправленными итераторами, теги которых являются производными от input_iterator_tag.

    На следующем шаге мы рассмотрим пользовательские итераторы.




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