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

голоса
4

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

Задан 19/05/2009 в 12:44
источник пользователем
На других языках...                            


5 ответов

голоса
6

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

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

Ответил 19/05/2009 в 12:47
источник пользователем

голоса
0

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

Ответил 19/05/2009 в 12:49
источник пользователем

голоса
1

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

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

Ответил 19/05/2009 в 12:50
источник пользователем

голоса
8

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

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

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

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

Ответил 19/05/2009 в 13:07
источник пользователем

голоса
2

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

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

Ответил 19/05/2009 в 16:52
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more