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