В чем разница между итераторы в Java и C ++?
============================================

Как это реализация итератора в Java отличается от такового в C ++?

 

В текущих C ++ (98) стандартная библиотека (в частности, часть ранее известная как STL) определяет форму итераторов, которые очень близки к указателям C (включая арифметику). Таким образом, они просто указывают где-то. Чтобы быть полезным, обычно требуется два указателя, так что вы можете перемещаться между ними. Я понимаю, C ++ 0x вводит диапазоны, которые действуют больше как Java итераторов.

Java представил `Iterator`(и `ListIterator`интерфейс) в 1.2, в основном принимая на себя более многословной перечисляемость. Java не имеет арифметики указателей, поэтому нет никакой необходимости вести себя как указатель. У них есть `hasNext`метод , чтобы увидеть , если они идут до конца, вместо того , чтобы требовать два итератора. Недостатком является то, что они являются менее гибкими. Система требует методов, `subList`а не перебор между двумя итераторами являются специфическими точки в списке , содержащем.

Общая разница в стиле является то, что в то время как использование C ++ «статический полиморфизм» через шаблоны, Java использует интерфейсы и общий динамический полиморфизм.

Концепция итераторов обеспечить клей, чтобы позволить разделение «алгоритм» (на самом деле управления потоком) и контейнером данных. Оба подхода сделать это достаточно хорошо. В идеальных условиях «нормальный» код должен только видеть итераторы.

 

C ++ не определяет, как реализуются итераторы. Она тем не менее определить их интерфейс и минимальное поведение они должны обеспечить, чтобы работать с другими компонентами стандартной библиотеки.

Например, для ввода итераторов, стандарт определяет, что итератор должен быть разыменовываемым через оператор *. Это, однако, не указать, каким образом, что оператор должен быть реализован.

 

*реализации* определяются полностью стандартными поставщиками библиотеки / производители JRE в C ++ / Java соответственно. Они свободны реализовать их , однако они хотят, до тех пор , как их поведение соответствует соответствующим стандартам.

 

C ++ итераторы (STL) пытаются имитировать синтаксис указателей как можно больше, через оператора перегрузки.

Стандартная спецификация определяет различные концепции итератора (как вперед, двунаправленный, произвольный доступ, вход, выход). Каждая концепция должна соответствовать определенному интерфейсу (например, ++ оператор вперед итератор, чтобы перейти к следующему элементу в последовательности, - для двунаправленного, +, + = для произвольного доступа и т.д.).

 

В C ++, вы видите людей , проходящих вокруг итераторы все время. С ++ итераторы «точка» к определенному элементу контейнера. Вы можете разыменования итератора , чтобы получить элемент (и вы можете сделать это снова и снова). Вы можете удалить элемент , который итератор ссылается эффективно. Вы можете также сделать копии итератора (либо путем присвоения другой переменной, или передавая итератор по значению функции) , чтобы отслеживать несколько мест одновременно. Итераторы в C ++ могут стать «аннулированными» определенными операциями на контейнере, в зависимости от контейнера. Когда итератор становится недействительными (правила которого могут быть сложными), операции с итератором имеет неопределенное поведение, и могут (непоследовательно) сбой программы или возвращать неверные результаты; хотя в некоторых структурах данных (например `std::list`), итераторы остаются в силе через большинство модификаций контейнера.

В Java, вы не видите , что вид использования. Итератора в Java указывает «между» двумя элементами, а не «у» элемента. Единственный способ получить элементы с итератором , чтобы переместить его вперед , чтобы получить элемент перемещен снова. Конечно , что изменяет состояние итератора, и вы не можете вернуться назад; если у Вас нет `ListIterator`в этом случае вы можете двигаться как вперед и назад (но он по - прежнему раздражает , чтобы двигаться вперед и назад , просто остаться еще). Вы не можете копировать итератор, так как интерфейс не предоставляет способ общественного копирования; так, например, вы не можете просто передать маркер конкретного места на функцию, не давая эту функцию ссылку на тот же итератор , что у вас есть, и , таким образом , позволяя им изменить состояние вашего итератора. В Java итератор будет признан недействительным (по крайней мере в стандартных контейнерах) с помощью какой - либо модификации контейнера , кроме как через итератор собственных `add()`или `remove()`методы, который является чрезмерно консервативным (например , большинство модификаций на а `LinkedList`не должен влиять на итератор). При попытке использовать УТРАТИТ итератор, он поднимает `ConcurrentModificationException`( по имени смешения , поскольку она не имеет ничего общего с параллельности) вместо того , что может привести к непредсказуемому поведению, которое хорошо.