2011-08-28 3 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는 여전히 enumerat을 가지고 있습니다. ​ 이온 ​는 C++과 비슷하지만 종류가 다릅니다.

  • 파이썬 : 반복자는 C# 열거 자와 같습니다. 생성자은 C# 반복자와 같습니다 (yield).

    열거하지 않음 ​ 이온 ​s, AFAIK.

0

나는 이것이 C++의 경우이지만, 자바에서 열거는 스레드로부터 안전하지 않습니다, 그래서 그것을 가지고 있지 않기 때문에 기본적으로 빠른 반복자 경우 확실하지 않다 반복자에 의해 행해지는 thread 액세스의 체크에 의한 오버 헤드.

자세한 내용은 blog entry을 참조하십시오.

0

기본적으로 C++의 SinglePassIterator, Java의 Iterator 및 C#의 IEnumerator는 모두 동일합니다.

AFAIK Java 및 C#은 가상 시스템에서 많은 작업을하는 "복제 가능"이어야하므로 ForwardIterator와 유사한 기능을 제공하지 않습니다. 새로운 복사본을 배열로 만들고 인덱스 액세스는 반복자보다 훨씬 빠릅니다.