На этом шаге мы приведем реализацию функции 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.
На следующем шаге мы рассмотрим пользовательские итераторы.