2011-08-28 2 views
4

Для итерации я знаю, что существуют итераторы разных типов. Forward, двунаправленный, произвольный доступ, который можно использовать для доступа к элементам в массиве.Iteration Vs. Перечисление

Для перечисления я слышал только о перечислениях, которые можно использовать для индексации предметов. Но существуют ли термины, называемые «перечислением» или перечислителем? Если да, то в чем разница между итерацией и перечислением?

+1

[enumerator] (http://download.oracle.com/javase/1.4.2/docs/api/java/util/Enumeration.html) - это концепция Java, которая позволяет использовать итератор над диапазоном/контейнером. –

ответ

11

Терминология действительно связана с языком и становится довольно запутанной.

В C++, «enumerat ​ ион» (enum) является имени, что означает «кучу пронумерованных пунктов», так что нет действия происходит; это всего лишь вещь (например, class).

И, конечно же, «iterat ​ иона» относится к действию, что означает «повторять это действие много раз». Часто это сопровождается просмотром списка предметов.

Но в некоторых языках, каждый из которых имеет определенное значение в качестве действий:

  • C#: Перечислители являются объектами, которые идут через элементы коллекции (например, итераторы C++; IEnumerator<T>). Итераторы методы, которые делают почти то же самое, но в сопрограммном стиле (yield return).

    C# все еще имеет enumerat ​ иона ​ с (enum ы), как в C++.

  • Java: Итераторы проходят элементы коллекции, как на C++. Я не уверен насчет «счетчиков».

    Java до сих пор enumerat ​ иона ​ s похож на C++, но они вроде разные, как хорошо.

  • Python: Итераторы похожи на счетчики C#; генераторы похожи на итераторы C# (yield).

    No enumerat ​ ion ​ s, AFAIK.

т.д.

0

Я не уверен, если это имеет место в C++, но в Java перечислитель по существу быстрее итератора, так как он не поточно, и поэтому он не имеет накладные расходы из-за проверки доступа к потоку, который выполняется итератором.

Для получения дополнительной информации см. Это blog entry.

0

Существенно, что единственный элемент C++ для SinglePassIterator, Iterator Java и IEnumerator C# эквивалентны.

AFAIK Java и C# не предлагают функции ForwardIterator, вероятно, потому что они должны быть «клонируемыми», , что является тяжелой операцией для виртуальных машин. Создание новой копии в массиве и доступ к индексу намного быстрее, чем итераторы.