Как уже упоминалось, итераторы Java и C # описывают смешанное положение (состояние) и диапазон (значение), в то время как итераторы C ++ разделяют понятия положения и диапазона. Итераторы C ++ представляют «где я сейчас» отдельно от «куда мне идти?».
Итераторы Java и C # не могут быть скопированы. Вы не можете восстановить предыдущую позицию. Обычные итераторы C ++ могут.
Рассмотрим этот пример :
// for each element in vec
for(iter a = vec.begin(); a != vec.end(); ++a){
// critical step! We will revisit 'a' later.
iter cur = a;
unsigned i = 0;
// print 3 elements
for(; cur != vec.end() && i < 3; ++cur, ++i){
cout << *cur << " ";
}
cout << "\n";
}
Нажмите на ссылку выше, чтобы увидеть вывод программы.
Этот довольно глупый цикл проходит последовательность (используя только семантику прямого итератора), печатая каждую смежную подпоследовательность из 3 элементов ровно один раз (и пару более коротких подпоследовательностей в конце). Но если предположить N элементов и M элементов на строку вместо 3, этот алгоритм все равно будет иметь O (N * M) приращений итераторов и O (1) пробел.
Итераторам в стиле Java не хватает возможности сохранять позиции независимо. Вы будете либо
- потерять O (1) место, используя (например) массив размера M для хранения истории при итерации
- нужно будет пройти по списку N раз, делая O (N ^ 2 + N * M) времени
- или используйте конкретный тип Array с функцией-членом GetAt, потеряв универсальность и возможность использовать типы контейнеров связанных списков.
Поскольку в этом примере использовалась только механика прямой итерации, я смог поменяться списком с без проблем . Это очень важно для разработки универсальных алгоритмов, таких как поиск, отложенная инициализация и оценка, сортировка и т. Д.
Неспособность сохранить состояние наиболее точно соответствует входному итератору C ++ STL, на котором построено очень мало алгоритмов.