2013-05-27 3 views
2

Основной итератор модель STL C++ s в основном состоит из „дать мне деталь в текущей позиции“ оператор *, а „перейти к следующему пункту“ оператор ++ и предикат ==/!= который используется для проверки (большую часть времени) против конечного итератора. Конечно, есть и другие итераторы с произвольным доступом, но самый простой выглядит так, как описано выше.C++ Итератор модель по сравнению с моделью Java итератора

Напротив, Java имеет next() и hasNext(). Следующий пример примерно эквивалентен использованию ++, а затем *. hasNext() - это что-то вроде сравнения с концом. Почему Java не приняла модель C++ (разумеется, у нее нет перегрузки оператора, поэтому она должна имитировать функции)? В частности, почему сравнение с конечным итератором упало для метода hasNext()? Мне часто бывает сложнее записывать итераторы в Java, чем в C++, потому что логика, стоящая за next() и hasNext(), часто сложнее, чем у операторов C++.

+0

см. этот пост http://stackoverflow.com/questions/56347/iterators-in-c-stl-vs-java-is-there-a-conceptual-difference и http: // stackoverflow.com/questions/882855/what-is-the-difference-between-iterators-in-java-and-c – taocp

+0

Различные философии - Java была разработана для простоты, в то время как итераторы STL структурированы после C-указателей. –

+0

@Scott Jones: Я не вижу здесь простоты ... – gexicide

ответ

4

Сначала вы должны понимать, что C++ имеет указатели, а итератор имитирует указатель.

Java не имеет указателей все не является объектом Java

C++ interators гораздо более мощным.

См. Дубликаты ответов на приведенные выше комментарии.

Iterators in C++ (stl) vs Java, is there a conceptual difference?

What is the difference between iterators in Java and C++?

Я предлагаю вам прочитать, как это объекты, обрабатываемые в Java - Objects in Java

0

Может быть, вы должны сравнить ++ итератор C с Java ListIterator, который индексируется доступ. Итератор Java для всех типов коллекций и воздерживается от возможного неэффективного индексированного доступа с доступом O (n). Это выбор. Конечно, можно перебирать подсписку, добиваясь того же результата.

  • В Java 7 итератор уже имеет статус второго гражданина, так как есть for (item : collection).
  • В Java 8 collection.forEach(function) предоставляется.

Ява 8 forEach - это определенное улучшение: Итератор снаружи поддерживает состояние. forEach выполняется самим классом коллекции. Это имеет последствия для выразительности (плавная комбинация), эффективности, параллелизма и оптимизации. (Может быть прочитан в другом месте.)

+0

Я не уверен, как реализована Java 8, но я бы поставил деньги на 'forEach', в конечном счете, используя« Итератор »коллекции в любом случае. – millimoose

+0

@millimoose в основном справа; пропаганда признана, но тогда можно было бы сделать что-то вроде 'parallel(). forEach (...)'. Что еще более важно, Итератору нужен открытый класс. tree.forEach может быть просто прогулкой по дереву. _Не заглядывай в него. –

0

простите мой английский

1, Java стиля итератор так же, как C++ категория вперед итератора, что часть C++ итератор

2, В C++ итератор только часть из STL, определить новый итератор в C++, а не просто означает, что вы можете обходить набор данных, это также означает, что вы можете использовать способность всего STL, это очень мощный;

Смежные вопросы