Рассмотрим входной итератор, например join_iterator
: он выполняет итерацию по конкатенации других диапазонов. Повторный вызов ++i
может быть намного медленнее, чем простой i += n
.
Тем не менее, большинство С++-кодов, которые требуют продвижения итератора произвольной суммой, использует std::advance
, который автоматически прибегает к вызову ++i
, когда итератор не является произвольным доступом.
(К сожалению, большинство людей используют std::advance(i, n)
вместо using std::advance; advance(i, n)
, поэтому я не могу просто поставить advance
для моего итератора и полагаться на ADL.)
С другой стороны, я не могу использовать +
или +=
, потому что итераторы ввода не должны их реализовывать.
Итак, вопрос: как я могу поддержать такой сценарий, когда:
-
Реализация такого итератора?
-
Используя итератор ввода, который может иметь оптимизированный
operator +=
?
(Обратите внимание, что advance
и +
не единственный сценарий, в котором это имеет значение - distance
и -
, имеет ту же проблему.)