Итератор идиомы полузакрытых диапазонов [begin(), end())
изначально основан на арифметике указателей для простых массивов. В этом режиме работы у вас будут функции, которым передан массив и размер.
void func(int* array, size_t size)
Преобразование в полузакрытые диапазоны [begin, end)
очень просто, если у вас есть эта информация:
int* begin;
int* end = array + size;
for (int* it = begin; it < end; ++it) { ... }
Работать с полностью закрытыми диапазонами сложнее:
int* begin;
int* end = array + size - 1;
for (int* it = begin; it <= end; ++it) { ... }
Поскольку указатели на массивы являются итераторами в C ++ (и синтаксис был разработан для этого), гораздо проще вызвать std::find(array, array + size, some_value)
, чем std::find(array, array + size - 1, some_value)
.
Кроме того, если вы работаете с полузакрытыми диапазонами, вы можете использовать оператор !=
для проверки конечного условия, поскольку (если ваши операторы определены правильно) <
подразумевает !=
.
for (int* it = begin; it != end; ++ it) { ... }
Однако не существует простого способа сделать это с полностью закрытыми диапазонами. Вы застряли с <=
.
Единственным видом итератора, который поддерживает операции <
и >
в C ++, являются итераторы с произвольным доступом. Если бы вам пришлось написать оператор <=
для каждого класса итераторов в C ++, вам нужно было бы сделать все ваши итераторы полностью сопоставимыми, и у вас было бы меньше вариантов для создания менее способных итераторов (таких как двунаправленные итераторы в * 1029). * или итераторы ввода, которые работают на iostreams
), если в C ++ используются полностью закрытые диапазоны.