2011-08-28 15 views
4

繰り返しの場合、さまざまな種類のイテレータがあることがわかります。フォワード、双方向、配列内の項目にアクセスするために使用できるランダムアクセス。反復列挙型

列挙型の場合、アイテムのインデックスに使用できる列挙型についてのみ聞いたことがあります。しかし、「列挙」または列挙子という用語がありますか?そうであれば、反復と列挙の違いは何ですか?

+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#が依然としてC++のような​ イオン ​ enumerat S(enum単数または複数)を有しています。

  • Java:イテレータは、C++のようにコレクションの項目を通過します。私は "列挙子"については分かりません。

    Javaはまだ​ イオン ​のC++に似ていますが、彼らは、同様の種類の異なるだがenumeratました。

  • Python:反復子はC#列挙子と似ています。 ジェネレータはC#イテレータと似ています(yield)。

    いいえenumerat ​ イオン ​s、AFAIK。

など

0

私は、これはC++の場合ですが、Javaで列挙子が、それはスレッドセーフではない、ので、それは持っていないので、本質的に速いイテレータであるかどうかわからないんだけどスレッドアクセスのチェックによるオーバーヘッドは、イテレータによって行われます。

詳細については、blog entryを参照してください。

0

基本的にC++のSinglePassIterator、JavaのIterator、およびC#のIEnumeratorはすべて同等です。

AFAIK JavaとC#は、仮想マシンにとって大量の操作である "クローン可能"である必要があるため、ForwardIteratorのような機能を提供していません。 新しいコピーを配列に作成してインデックスにアクセスするのは、イテレータよりもはるかに高速です。