Ответ 1
Все итераторы равны друг другу. Только итераторы с произвольным доступом сравнимы по аналогии. Итераторы ввода, форвардные итераторы и двунаправленные итераторы не являются сравнимо сопоставимыми.
Таким образом, сравнение с использованием !=
является более общим и гибким, чем сравнение с использованием <
.
Существуют разные категории итераторов, поскольку не все диапазоны элементов имеют одинаковые свойства доступа. Например,
-
если у вас есть итераторы в массив (непрерывная последовательность элементов), это тривиально, чтобы относительно сравнить их; вам просто нужно сравнить индексы указателей на элементы (или указатели на них, поскольку итераторы, вероятно, просто содержат указатели на элементы);
-
если у вас есть итераторы в связанном списке, и вы хотите проверить, является ли один итератор "меньше" другого итератора, вам нужно пройти узлы связанного списка с одного итератора, пока вы не достигнете другого итератор или вы дойдете до конца списка.
Правило состоит в том, что все операции над итератором должны иметь постоянную временную сложность (или, как минимум, сублинейную временную сложность). Вы всегда можете выполнять сравнение равенства в постоянное время, так как вам просто нужно сравнить, указывают ли итераторы на один и тот же объект. Таким образом, все итераторы эквивалентны равенству.
Кроме того, вам не разрешается увеличивать итератор за конец диапазона, на который он указывает. Итак, если вы закончите сценарий, в котором it != foo.end()
не делает то же самое, что и it < foo.end()
, у вас уже есть поведение undefined, потому что вы прошли через конец диапазона.
То же самое верно для указателей в массиве: вам не разрешается увеличивать указатель за пределами одного конца массива; программа, которая делает это, демонстрирует поведение undefined. (То же самое, очевидно, неверно для индексов, так как индексы являются целыми числами.)
Некоторые реализации стандартной библиотеки (например, реализация стандартной библиотеки Visual С++) имеют полезный код отладки, который будет вызывать утверждение, когда вы делаете что-то незаконное с таким итератором.