Вы правы;для operator+/-
необходимо, чтобы это была операция O(1)
, которая не может быть выполнена двунаправленными итераторами.std::advance
не имеет такого требования к скорости (но будет использовать его, когда доступно, например, для итераторов с произвольным доступом).
Обратите внимание, что boost имеет boost::next
и boost::prior
реализации для итераторов;Я не уверен, какой у них статус по стандартизации, но если он в бусте, то он твердый.