inline random_access_iterator_tag iterator_category(const random_access_iterator‹T, Distance›&) {
return random_access_iterator_tag();
}
template ‹class T›
inline random_access_iterator_tag iterator_category(const T*) {
return random_access_iterator_tag();
}
// value_type of iterator (функции значимого типа итераторов)
template ‹class T, class Distance›
inline T* value_type(const input_iterator‹T, Distance›&) {
return (T*) (0);
}
template ‹class T, class Distance›
inline T* value_type(const forward_iterator‹T, Distance›&) {
return (T*) (0);
}
template ‹class T, class Distance›
inline T* value_type(const bidirectional_iterator‹T, Distance›&) {
return (T*) (0);
}
template ‹class T, class Distance›
inline T* value_type(const random_access_iterator‹T, Distance›&) {
return (T*) (0);
}
template ‹class T›
inline T* value_type(const T*) {return (T*) (0);}
// distance_type of iterator (функции типа расстояния итераторов)
template ‹class T, class Distance›
inline Distance* distance_type(const input_iterator‹T, Distance›&) {
return (Distance*) (0);
}
template ‹class T, class Distance›
inline Distance* distance_type(const forward_iterator‹T, Distance›&) {
return (Distance*) (0);
}
template ‹class T, class Distance›
inline Distance* distance_type(const bidirectional_iterator‹T, Distance›&) {
return (Distance*) (0);
}
template ‹class T, class Distance›
inline Distance* distance_type(const random_access_iterator‹T, Distance›&) {
return (Distance*) (0);
}
template ‹class T›
inline ptrdiff_t* distance_type(const T*) {return (ptrdiff_t*) (0);}
Если пользователь хочет определить двунаправленный итератор для некоторой структуры данных, содержащей double, и такой, чтобы работал с большой (large) моделью памяти компьютера, то это может быть сделано таким определением:
class MyIterator: public bidirectional_iterator ‹double, long› {
// код, осуществляющий ++, и т.д.
};
Тогда нет необходимости определять iterator_category, value_type, и distance_type в MyIterator.
Операции с итераторами (Iterator operations)
Так как только итераторы произвольного доступа обеспечивают + и - операторы, библиотека предоставляет две шаблонные функции advance и distance. Эти функции используют + и - для итераторов произвольного доступа (и имеют, поэтому, сложность постоянного времени для них); для итераторов ввода, последовательных и двунаправленных итераторов функции используют ++, чтобы обеспечить реализацию со сложностью линейного времени. advance берет отрицательный параметр n только для итераторов произвольного доступа и двунаправленных итераторов. advance увеличивает (или уменьшает для отрицательного n) итераторную ссылку i на n. distance увеличивает n на число единиц, сколько требуется, чтобы дойти от first до last.
template ‹class InputIterator, class Distance›
inline void advance(InputIterator& i, Distance n);
template ‹class InputIterator, class Distance›
inline void distance(InputIterator first, InputIterator last, Distance& n);
distance должна быть функцией 3-х параметров, сохраняющей результат в ссылке вместо возвращения результата, потому что тип расстояния не может быть выведен из встроенных итераторных типов, таких как int*.