27 Iterators library [iterators]

27.4 Iterator primitives [iterator.primitives]

27.4.3 Iterator operations [iterator.operations]

Поскольку только итераторы произвольного доступа обеспечивают + и - оператор, библиотека предоставляет два шаблона функции advance и distance. Эти шаблоны функций используют + и - для итераторов произвольного доступа (и, следовательно, являются для них постоянным временем); для входных, прямых и двунаправленных итераторов они используют ++ для реализации линейного времени.

template <class InputIterator, class Distance> constexpr void advance(InputIterator& i, Distance n);

Requires: n должен быть отрицательным только для двунаправленных итераторов и итераторов с произвольным доступом.

Effects: Увеличивает (или уменьшает для отрицательного значения n) ссылкуi на итератор на n.

template <class InputIterator> constexpr typename iterator_traits<InputIterator>::difference_type distance(InputIterator first, InputIterator last);

Effects: Если InputIterator соответствует требованиям итератора произвольного доступа, возвращается (last - first); в противном случае возвращает количество приращений, необходимых для перехода от first к last.

Requires: Если InputIterator удовлетворяет требованиям итератора произвольного доступа, last должен быть доступен first или first должен быть доступен из last; в противном случае last должен быть доступен из first.

template <class InputIterator> constexpr InputIterator next(InputIterator x, typename iterator_traits<InputIterator>::difference_type n = 1);

Effects: Эквивалентен: advance(x, n); return x;

template <class BidirectionalIterator> constexpr BidirectionalIterator prev(BidirectionalIterator x, typename iterator_traits<BidirectionalIterator>::difference_type n = 1);

Effects: Эквивалентен: advance(x, -n); return x;