Если вы уже ограничили / жестко закодировали свой алгоритм для использования только std::vector::iterator
и std::vector::iterator
, на самом деле не имеет значения, какой метод вы в конечном итоге будете использовать. Ваш алгоритм уже конкретизирован за пределами точки, где выбор одного из других может иметь любое значение. Они оба делают одно и то же. Это просто вопрос личных предпочтений. Я бы лично использовал явное вычитание.
Если, с другой стороны, вы хотите сохранить более высокую степень универсальности в вашем алгоритме, а именно, чтобы дать возможность того, что когда-нибудь в будущем он может быть применен к какому-либо другому типу итератора, тогда лучший метод зависит на ваше намерение. Это зависит от того, насколько вы хотите ограничить тип итератора, который можно использовать здесь.
Если вы используете явное вычитание, ваш алгоритм будет ограничен довольно узким классом итераторов: итераторами с произвольным доступом. (Это то, что вы получаете сейчас от std::vector
)
Если вы используете distance
, ваш алгоритм будет поддерживать гораздо более широкий класс итераторов: входные итераторы.
Конечно, вычисление distance
для итераторов без произвольного доступа является в общем случае неэффективной операцией (хотя, опять же, для произвольных итераторов это так же эффективно, как вычитание). Вы сами решаете, имеет ли ваш алгоритм смысл для итераторов без произвольного доступа, с точки зрения эффективности. Если результирующая потеря эффективности опустошает вас до такой степени, что делает ваш алгоритм совершенно бесполезным, тогда вам лучше придерживаться вычитания, что запрещает неэффективное использование и вынуждает пользователя искать альтернативные решения для других типов итераторов. Если эффективность с итераторами без произвольного доступа все еще находится в пригодном для использования диапазоне, то вам следует использовать distance
и задокументировать тот факт, что алгоритм работает лучше с итераторами с произвольным доступом.