반복기

Iterator

컴퓨터 프로그래밍에서 반복기는 프로그래머가 컨테이너, 특히 [1][2][3]목록을 통과할 수 있도록 하는 객체입니다.다양한 유형의 반복기는 종종 컨테이너 인터페이스를 통해 제공됩니다.주어진 반복기의 인터페이스와 의미론은 고정되어 있지만 반복기는 종종 컨테이너 구현의 기초가 되는 구조 측면에서 구현되며 반복기의 작동 의미론을 활성화하기 위해 종종 컨테이너와 밀접하게 결합됩니다.반복기는 트래버설을 실행하고 컨테이너 내의 데이터 요소에 대한 접근을 제공하지만, 그 자체는 반복을 실행하지 않는다(즉, 그 개념 또는 용어의 [citation needed]사소한 사용에 의해 취해진 중대한 자유가 없는 것은 아니다).

반복기는 동작상 데이터베이스 커서와 유사합니다.반복기는 1974년에 CLU 프로그래밍 언어로 거슬러 올라갑니다.

묘사

내부 반복기

내부 반복기는 다음과 같은 고차 함수(종종 익명 함수를 사용하지만 필수는 아님)입니다.map(),reduce()컨테이너 통과를 구현하여 모든 요소에 주어진 기능을 차례로 적용합니다.예를 들어 Python의 경우map기능:

숫자 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]  제곱_변형 = 지도(람다 x: x**2, 숫자) # 이 반복기를 반복하면 0, 1, 4, 9, 16, ..., 81이 됩니다. 

외부 반복기 및 반복기 패턴

외부 반복기는 오브젝트 컬렉션의 특정 요소(요소 액세스)를 참조하는 것과 다음 요소(요소 트래버설)[4]를 가리키도록 자신을 수정하는 두 가지 주요 작업을 가진 포인터 유형으로 생각할 수 있습니다.또한 컨테이너의 모든 요소가 사용되었는지 확인하는 방법뿐만 아니라 일부 첫 번째 요소를 가리키도록 반복기를 만드는 방법도 있어야 합니다.언어 및 사용 목적에 따라 반복자는 추가 작업을 제공하거나 다른 동작을 나타낼 수도 있습니다.

반복기의 주요 목적은 사용자가 용기의 모든 요소를 처리하면서 [2]용기의 내부 구조로부터 사용자를 격리하는 것입니다.이를 통해 컨테이너는 원하는 방식으로 요소를 저장할 수 있으며 사용자는 이를 단순한 시퀀스 또는 목록처럼 처리할 수 있습니다.반복기 클래스는 일반적으로 해당 컨테이너 클래스와 긴밀하게 연계하여 설계됩니다.일반적으로 컨테이너는 반복기를 만드는 방법을 제공합니다.

루프 카운터는 루프 리터레이터라고도 불립니다., 루프 카운터는 트래버설 기능만 제공하며 요소 액세스 기능은 제공하지 않습니다.

제너레이터

반복기를 구현하는 한 가지 방법은 발생기로 알려진 제한된 형태의 코루틴을 사용하는 것입니다.서브루틴과 대조적으로 제너레이터 코루틴은 한 번만 반환하는 것이 아니라 여러 번 값을 호출자에게 제공할 수 있습니다.대부분의 반복기는 생성기로서 당연히 표현 가능하지만, 생성기는 호출 사이에 로컬 상태를 유지하므로 트리 트래버와 같은 복잡하고 상태 저장 반복기에 특히 적합합니다."제너레이터"와 "반복자"라는 용어의 사용에는 저자 및 [5]언어에 따라 미묘한 차이와 차이가 있습니다.Python에서 생성기는 반복 생성자(반복자를 반환하는 함수)입니다.Python 생성기가 Python의 Python을 사용하여 Fibonacci 숫자에 대한 반복기를 반환하는 예제입니다.yield스테이트먼트는 다음과 같습니다.

방어하다 파이보나치(제한.):     a, b = 0, 1     위해서 _  범위(제한.):         산출하다 a         a, b = b, a + b  위해서 번호  파이보나치(100): # 발전기가 반복기를 구성합니다.     인쇄물(번호) 

암묵적 반복자

C#, C++(나중에 나온 버전), 델파이(나중에 나온 버전), Go, Java(나중에 나온 버전), Lua, Perl, Python, Ruby와 같은 일부 객체 지향 언어는 명시적인 반복기 객체를 도입하지 않고도 컨테이너 객체의 요소를 통해 반복하는 고유한 방법을 제공합니다.실제 반복 개체는 실제로 존재할 수 있지만 실제로 존재할 경우 해당 [4][6]언어의 소스 코드 내에 노출되지 않습니다.

암묵적 반복자는 다음 Python 예시와 같이 "foreach" 문(또는 이에 상당하는 문)으로 나타나는 경우가 많습니다.

위해서 가치  반복할 수 있다:     인쇄물(가치) 

Python에서 반복 가능은 반복기로 변환할 수 있는 오브젝트입니다.이 오브젝트는 for 루프 중에 반복됩니다.이것은 암묵적으로 실행됩니다.

또는 다음 Ruby 예시와 같이 컬렉션 오브젝트 자체에 의해 작성되는 경우가 있습니다.

반복할 수 있다.각각 하다  가치    놓다 가치 끝. 

이 반복 스타일은 때때로 "내부 반복"이라고 불리기도 하는데, 그 이유는 그 코드가 (반복의 모든 측면을 제어하는) 반복 가능한 객체의 컨텍스트 내에서 완전히 실행되고 프로그래머는 (어나니머스 함수를 사용하여) 각 단계에서 실행할 연산만 제공하기 때문이다.

목록 압축 또는 유사한 구성을 지원하는 언어도 Python에서와 같이 결과 목록을 구성하는 동안 암묵적인 반복자를 사용할 수 있습니다.

이름 = [사람인.이름. 위해서 사람인  명부 한다면 사람인.남자] 

때때로 암묵적인 숨겨진 본성은 부분적일 뿐이다.C++ 언어에는 암묵적인 반복을 위한 몇 가지 함수 템플릿이 있습니다.for_each(). 이러한 함수에서는 초기 입력으로 명시적인 반복 개체가 여전히 필요하지만, 이후 반복에서는 반복 개체가 사용자에게 노출되지 않습니다.

스트림

반복기는 입력 스트림의 유용한 추상화입니다. 무한 반복 가능(인덱스 가능은 아니지만) 개체를 제공합니다.Perl 및 Python과 같은 여러 언어가 스트림을 반복기로 구현합니다.Python에서 반복기는 데이터 [7]스트림을 나타내는 객체입니다.스트림의 대체 구현으로는 AWK sed와 같은 데이터 기반 언어가 있습니다.

인덱싱과 비교

절차 언어에서는 배열과 같은 시퀀스의 모든 요소를 루프하기 위해 첨자 연산자와 루프 카운터를 사용하는 것이 일반적입니다.인덱스를 일부 개체 지향 컨테이너와 함께 사용할 수도 있지만 반복기를 사용하면 다음과 같은 [8]이점이 있습니다.

  • 카운트 루프가 모든 데이터 구조, 특히 목록이나 트리처럼 랜덤 액세스가 없거나 느린 데이터 구조에는 적합하지 않습니다.
  • 반복기는 모든 종류의 데이터 구조에서 일관된 방법으로 반복할 수 있으므로 데이터 구조의 변경에 대한 코드를 보다 읽기 쉽고 재사용 가능하며 덜 민감하게 만들 수 있습니다.
  • 반복자는 요소를 건너뛸 수 없거나 이전에 방문한 요소에 다시 액세스할 수 없도록 하는 등 액세스에 대한 추가 제한을 적용할 수 있습니다.
  • 반복기는 반복기를 무효화하지 않고 컨테이너 개체를 변경할 수 있습니다.예를 들어, 반복기가 첫 번째 요소를 넘어서면 예측 가능한 결과로 컨테이너의 선두에 추가 요소를 삽입할 수 있습니다.색인화에서는 색인 번호를 변경해야 하므로 이 문제가 발생합니다.

컨테이너의 요소를 통해 반복하는 동안 컨테이너를 수정할 수 있는 능력은 객체와 운영의 효과 사이의 상호 관계가 명확하지 않을 수 있는 현대 객체 지향 프로그래밍에서 필요하게 되었습니다.반복기를 사용함으로써 이러한 종류의 결과로부터 격리됩니다.그러나 이 주장은 거의 대부분 효율성을 위해 반복기 구현이 컨테이너에 단단히 묶여 있기 때문에 자신을 무효화하지 않고 기본 컨테이너의 수정을 배제하기 때문에 신중하게 받아들여져야 합니다.

메모리에서 데이터를 이동할 수 있는 용기의 경우, 반복기를 무효화하지 않는 유일한 방법은 현재 활성 상태인 모든 반복기를 추적하여 즉시 업데이트하는 것입니다.고정된 컨테이너의 크기에 비해 주어진 시간에 반복하는 횟수가 임의로 클 수 있으므로, 이들을 모두 업데이트하면 컨테이너 운영의 복잡성 보장이 크게 손상됩니다.

컨테이너 크기에 상대적으로 바인딩된 업데이트 수를 유지하는 다른 방법은 컨테이너 요소를 사용하여 업데이트해야 하는 간접 포인터 모음인 일종의 핸들 메커니즘을 사용하고 반복자가 데이터 요소 대신 이러한 핸들을 가리키도록 하는 것입니다.그러나 이 접근법은 실제 데이터 요소에 액세스하기 위해 이중 포인터를 사용해야 하므로 반복기 성능에 부정적인 영향을 미칩니다.이것은 보통 바람직하지 않습니다.반복기를 사용하는 많은 알고리즘이 확장 메서드보다 반복기 데이터 액세스 작업을 더 자주 호출하기 때문입니다.따라서 매우 효율적인 데이터 액세스 기능을 가진 반복기를 사용하는 것이 특히 중요합니다.

대체로 이는 항상 보안(반복자는 항상 유효)과 효율성 간의 트레이드오프입니다.대부분의 경우, 추가된 보안은 비용을 지불할 수 있는 효율성 가격만큼의 가치가 없습니다.반복기의 안정성이 필요한 경우 대체 컨테이너(예: 벡터 대신 단일 링크 리스트)를 사용하는 것이 더 나은 선택이다(글로벌적으로 더 효율적이다).

반복기 분류

반복기 카테고리

반복기는 기능에 따라 분류할 수 있습니다.다음은 반복기 카테고리 [9][10]목록입니다(완전하지 않은) 목록입니다.

카테고리 언어들
양방향 반복기 C++
전송 반복기 C++
입력 반복기 C++
출력 반복기 C++
랜덤 액세스 반복기 C++
사소한 반복기 C++( STL)[11]

반복기 유형

이러한 언어에서 사용되는 다양한 언어 또는 라이브러리가 반복기 유형을 정의합니다.[12] 중 일부는

유형 언어들
어레이 리터레이터 PHP, R[13]
캐시 리테이터 PHP
상수 반복기 C++,[14] PHP
디렉토리 리터레이터 PHP, Python
필터 반복기 PHP, R
리미트 리터레이터 PHP
리스트 리터레이터 자바,[6] R
재귀 배열 반복기 PHP
XML 리터레이터 PHP

다양한 프로그래밍 언어

C# 및 기타NET 언어

리피터NET Framework는 "enumerator"라고 불리며, 다음과 같이 표시됩니다.IEnumerator인터페이스입니다. IEnumerator를 제공하다MoveNext()method: 다음 요소로 진행되며 수집의 끝에 도달했는지 여부를 나타냅니다.Current속성: 현재 포인팅 중인 요소의 값을 얻습니다.선택사항Reset()method: 열거자를 초기 위치로 되감습니다.처음에 열거자는 첫 번째 요소 앞에 있는 특별한 값을 가리키기 때문에 에 대한 호출은MoveNext()를 반복해야 합니다.

열거자는 일반적으로 다음 명령어를 호출하여 가져옵니다.GetEnumerator()오브젝트 구현 방법IEnumerable인터페이스입니다.컨테이너 클래스는 일반적으로 이 인터페이스를 구현합니다.단, C#foreach 문은 구현되지 않더라도 이러한 메서드를 제공하는 모든 개체에서 작동할 수 있습니다.IEnumerable(타자 입력).두 인터페이스 모두 에서 범용 버전으로 확장되었습니다.NET 2.0

다음으로 C# 2.0에서의 간단한 반복기 사용을 나타냅니다.

// 명시 버전 IENumerator< >마이타입> 반복하다 = 목록..Get Enumerator(); 하는 동안에 (반복하다.[다음으로 이동(Move Next))())     콘솔.기입선(반복하다.현재의);  // 암묵 버전 앞지르다 (마이타입 가치  목록.)     콘솔.기입선(가치); 

C# 2.0은 제너레이터도 지원합니다.이것은 반환으로 선언된 메서드입니다.IEnumerator(또는IEnumerable)는, 「」를 사용합니다.yield return오브젝트 인스턴스를 반환하는 대신 일련의 요소를 생성하는 문은 컴파일러에 의해 적절한 인터페이스를 구현하는 새로운 클래스로 변환됩니다.

C++

C++ 언어는 표준 라이브러리에서 반복자를 폭넓게 사용하고 허용 연산 레퍼토리에 따라 다른 반복자 카테고리를 기술합니다.여기에는 전송 반복기, 양방향 반복기랜덤 액세스 반복기가 포함됩니다.모든 표준 컨테이너 템플릿 유형은 이러한 범주 중 하나의 반복기를 제공합니다.반복기는 배열의 요소에 대한 포인터를 일반화하고(반복기로 실제로 사용할 수 있음), 그 구문은 Cpointer 산술의 것과 비슷하도록 설계되어 있습니다.*그리고.->연산자는 반복기와 포인터 산술 연산자가 가리키는 요소를 참조하기 위해 사용됩니다.++컨테이너 통과에서 반복기를 수정하는 데 사용됩니다.

반복기를 사용한 통과에는 일반적으로 하나의 다양한 반복기와 통과할 범위를 구분하는 역할을 하는 두 개의 고정 반복기가 포함됩니다.조작자의 적용 횟수에 따른 제한 반복기 사이의 거리++하한값을 상한값으로 변환하는 데 필요한 값은 지정된 범위의 항목 수와 같습니다. 관련된 고유 반복기 값의 수는 그 값보다 1개 더 많습니다.관례상 하한 반복기는 범위 내의 첫 번째 요소를 "지시"하지만 상한 반복기는 범위 내의 어떤 요소도 가리키지 않고 오히려 범위의 끝 부분을 가리킵니다.컨테이너 전체의 트래버스의 경우,begin()method는 하한치를 제공합니다.end()상한선후자는 컨테이너의 요소를 전혀 참조하지 않지만 비교할 수 있는 유효한 반복기 값입니다.

다음으로 반복기의 일반적인 사용 예를 나타냅니다.

표준::벡터< >인트> 항목들; 항목들.푸시백(5); // 벡터 '항목'에 정수 값 '5'를 추가합니다. 항목들.푸시백(2); // 벡터 '항목'에 정수 값 '2'를 추가합니다. 항목들.푸시백(9); // 벡터 '항목'에 정수 값 '9'를 추가합니다.  위해서 (자동 그것 = 항목들.시작한다.(); 그것 != 항목들.끝.(); ++그것) { // 'items'까지 반복합니다.   표준::외치다 << > *그것; // 현재 인덱스의 'items' 값을 인쇄합니다. } // C++11 에서는, 같은 조작을 반복하지 않고 실시할 수 있습니다. 위해서 (자동 x : 항목들) {   표준::외치다 << > x; // '항목'의 각 요소 'x' 값을 인쇄합니다. }  // 양쪽 for 루프가 "529"로 인쇄됩니다. 

반복기 유형은 함께 사용되는 용기 유형과는 별개이지만, 이 두 가지 유형은 종종 함께 사용됩니다.반복기의 범주(및 이에 대해 정의된 작업)는 보통 컨테이너의 유형에 따라 달라집니다.예를 들어 어레이나 벡터는 랜덤 액세스 반복기를 제공하지만 세트(실장으로서 링크된 구조를 사용)는 양방향 반복기만 제공합니다.동일한 컨테이너 유형 하나에는 여러 개의 관련 반복기 유형을 포함할 수 있습니다. 예를 들어,std::vector<T>컨테이너 유형은 요소(유형)에 대한 (원시) 포인터를 사용하여 통과를 허용합니다.*<T>) 또는 특수한 유형의 값std::vector<T>::iterator또, 다른 타입은, 통상의 (전송) 트래버설을 실행하는 알고리즘이 역순서로 트래버설을 실행하도록 정의되어 있는 「리버스 리터레이터」를 위해서도 제공됩니다.대부분의 컨테이너는 별도의 컨테이너를 제공합니다.const_iterator지정된 값을 변경할 수 있는 작업이 의도적으로 정의되지 않은 유형입니다.

컨테이너 오브젝트 또는 그 요소의 범위의 단순한 트래버설(단, 컨테이너 오브젝트 또는 컨테이너 오브젝트의 범위)const_iterator는, 반복기만을 사용해 실행할 수 있습니다.그러나 컨테이너 유형은 다음과 같은 방법을 제공할 수도 있습니다.insert또는erase컨테이너 자체의 구조를 수정합니다. 이러한 메서드는 컨테이너 클래스의 메서드이지만 원하는 작업을 지정하려면 하나 이상의 반복자 값이 필요합니다.같은 컨테이너를 동시에 가리키고 있는 여러 개의 반복기가 있을 수 있지만 구조 변경 조작에 의해 특정 반복기 값이 비활성화될 수 있습니다(각 케이스에 대해 표준으로 지정됨). 비활성화된 반복기를 사용하는 것은 정의되지 않은 동작으로 이어지는 오류이며 이러한 오류는 에러에 의해 시그널링될 필요는 없습니다.실행 시간 시스템

암묵적 반복은 다음과 같은 표준 함수 템플릿을 사용하여 C++에서도 부분적으로 지원됩니다.std::for_each(),std::copy()그리고.std::accumulate().

사용하는 경우 기존 반복기를 사용하여 초기화해야 합니다(보통begin그리고.end반복이 발생하는 범위를 정의합니다.그러나 반복이 진행되는 동안 명시적 반복 개체는 이후 노출되지 않습니다.다음 예시는 의 사용을 나타내고 있습니다.for_each.

컨테이너.유형< >아이템 타입> c; // ItemType 요소의 표준 컨테이너 유형.  무효 프로세스 항목(컨스턴트 아이템 타입& i) { // 컬렉션의 각 항목을 처리하는 함수입니다.   표준::외치다 << > i << > 표준::; }  표준::각각(c.시작한다.(), c.끝.(), 프로세스 항목); // 각 반복 루프. 

동일한 작업을 수행할 수 있습니다.std::copy패스, 패스std::ostream_iterator3번째 반복기로서의 값:

표준::알았다.(c.시작한다.(), c.끝.(), 표준::오스트림_이터레이터< >아이템 타입>(표준::외치다, "\n")); 

C++11 이후 lamda 함수 구문을 사용하여 인라인으로 반복되는 동작을 지정할 수 있으므로 명명된 함수를 정의할 필요가 없습니다.다음은 람다 함수를 사용한 각 반복의 예입니다.

컨테이너.유형< >아이템 타입> c; // ItemType 요소의 표준 컨테이너 유형.  // 람다 함수가 있는 각 반복 루프. 표준::각각(c.시작한다.(), c.끝.(), [](컨스턴트 아이템 타입& i) { 표준::외치다 << > i << > 표준::; }); 

자바

Java JDK 1.2 릴리즈에서 도입된,java.util.Iteratorinterface를 사용하면 컨테이너 클래스를 반복할 수 있습니다.각각Iterator를 제공하다next()그리고.hasNext()method 및 옵션으로 지원 가능한remove()방법.반복기는 대응하는 컨테이너 클래스로 작성되며 일반적으로 다음과 같은 메서드로 작성됩니다.iterator()를 클릭합니다.[15]

next()method는 반복기를 전진시키고 반복기가 가리키는 값을 반환합니다.첫 번째 요소는 에 대한 첫 번째 호출 시 취득됩니다.next()컨테이너 내의 모든 요소를 언제 방문했는지 판단한다.hasNext()테스트 방법을 사용합니다.다음으로 반복기의 간단한 사용 예를 나타냅니다.

반복기 반복하다 = 목록..리터레이터(); // 반복기 <MyType> 반복기 = list.iterator(); // J2SE 5.0의 경우 하는 동안에 (반복하다.다음()) {     시스템..나가..인쇄물(반복하다.다음 분.());     한다면 (반복하다.다음())         시스템..나가..인쇄물(", "); } 

을 나타내기 위해hasNext()반복 호출할 수 있습니다.요소 사이에 콤마를 삽입할 때 사용합니다만, 마지막 요소 뒤에는 사용할 수 없습니다.

이 접근방식에서는 어드밴스 조작과 실제 데이터 액세스를 적절히 분리할 수 없습니다.각 진행에 대해 데이터 요소를 두 번 이상 사용해야 하는 경우 임시 변수에 저장해야 합니다.데이터 액세스 없이 진행이 필요한 경우(즉, 특정 데이터 요소를 건너뛰기 위해), 이 경우 반환된 값은 무시되지만 그래도 액세스가 수행됩니다.

이를 지원하는 수집 유형의 경우remove()반복기의 메서드는 반복기를 사용할 수 있도록 유지하면서 컨테이너에서 가장 최근에 방문한 요소를 제거합니다.컨테이너의 메서드(같은 스레드에서도)를 호출하여 요소를 추가하거나 제거하면 반복기를 사용할 수 없게 됩니다.다음 요소를 가져오려고 하면 예외가 발생합니다.요소가 더 이상 남아 있지 않은 경우에도 예외가 발생합니다).hasNext()이전에 false를 반환했습니다).

추가 정보:java.util.List이 있다java.util.ListIterator는 유사하지만 정방향 및 역방향 반복을 허용하며 목록에 현재 인덱스를 제공하고 해당 위치에 목록 요소를 설정할 수 있습니다.

Java의 J2SE 5.0 릴리스에서는Iterable확장 지원 인터페이스for(앞서) 컬렉션 및 어레이를 반복하기 위한 루프입니다. Iterable를 정의합니다.iterator()반환하는 메서드Iterator. 확장판 사용forloop, 앞의 예는 다음과 같이 고쳐 쓸 수 있습니다.

위해서 (마이타입 obj : 목록.) {     시스템..나가..인쇄물(obj); } 

일부 컨테이너는 이전 버전(1.0 이후)도 사용합니다.Enumeration수업시간.hasMoreElements()그리고.nextElement()메서드에는 컨테이너를 수정할 메서드가 없습니다.

스칼라

Scala에서 반복기는 컬렉션과 유사한 풍부한 메서드 세트를 가지고 있으며 루프에 직접 사용할 수 있습니다.실제로 반복자와 수집품 모두 공통의 기본 특성으로부터 물려받습니다.scala.collection.TraversableOnce그러나 Scala 컬렉션 라이브러리에서 사용할 수 있는 다음과 같은 다양한 메서드 집합이 있습니다.map,collect,filterscala에서 프로그래밍할 때 반복기를 직접 다룰 필요가 없는 경우가 많습니다.

Java 반복기와 컬렉션은 한 줄을 추가하는 것만으로 각각 Scala 반복기와 컬렉션으로 자동 변환할 수 있습니다.

수입품 스칼라.수집.Java Conversions._ 

파일로 이동합니다.JavaConversionsobject는 이를 위해 암묵적인 변환을 제공합니다.암묵적 변환은 Scala의 기능입니다.현재 스코프에서 볼 수 있는 경우 콜을 적절한 위치에 있는 관련 표현에 자동으로 삽입하여 그렇지 않을 때 콜을 타이프 체크하도록 하는 메서드입니다.

매트랩

MATLAB은 '네이티브' 어레이를 사용하여 외부 및 내부 암묵적 반복을 모두 지원합니다.cell어레이.사용자가 트래버설을 진행하고 다음 요소를 요구할 책임이 있는 외부 반복의 경우 어레이 스토리지 구조 내에서 요소 세트를 정의하고 다음 요소를 트래버할 수 있습니다.for-루프 구성.예를들면,

% 정수 배열 정의 myArray = [1,3,5,7,11,13];  위해서 n = myArray    %...n으로 작업합니다.    디스패치(n)  명령 창에 대한 에코 정수 비율(%) 끝. 

를 사용하여 정수 배열을 통과합니다.for키워드를 지정합니다.

사용자가 컬렉션의 모든 요소에 걸쳐 실행하는 조작을 반복기에 제공할 수 있는 내부 반복의 경우, 많은 임베디드 연산자 및 MATLAB 함수가 오버로드되어 배열의 모든 요소에 대해 실행되며 대응하는 출력 배열을 암묵적으로 반환한다.또,arrayfun그리고.cellfun커스텀 또는 사용자 정의의 조작을 「패키지」어레이로 실행할 때, 기능을 활용할 수 있습니다.cell어레이를 설정합니다.예를들면,

기능. 심플한 재미 % 정수 배열 정의 myArray = [1,3,5,7,11,13];  % 각 요소에 대해 커스텀 조작 실행 my New Array = 어레이 기능(@(a)마이 커스텀재밌어요(a),myArray);  결과 어레이를 명령 창에 에코하는 비율(%) my New Array  기능. 보다 큰 스케일러 = 마이 커스텀재밌어요(스케일러) % 심플하게 2를 곱하다 보다 큰 스케일러 = 2*스케일러; 

주요 기능을 정의합니다.simpleFun커스텀 서브기능을 암묵적으로 적용하는myCustomFun내장 기능을 사용하여 배열의 각 요소에 대해arrayfun.

또는 Iterator 패턴의 커스텀 객체 지향 MATLAB 구현을 정의함으로써 어레이 스토리지 컨테이너의 메커니즘을 사용자로부터 추상화하는 것이 바람직할 수 있습니다.외부 반복을 지원하는 이러한 구현은 MATLAB Central File Exchange 항목 설계 패턴에 설명되어 있습니다. 반복기(동작).이는 MATLAB 소프트웨어 버전 7.6(R2008a)에서 도입된 새로운 클래스 정의 구문으로 작성되었으며 1차원적인 기능을 갖추고 있습니다.cell이질적인(데이터형) 요소 세트를 저장하기 위한 메커니즘으로서 ADT(목록 추상 데이터형)를 어레이로 실현합니다.이 명령어는 를 사용한 명시적인 전송 리스트트래버설 기능을 제공합니다.hasNext(),next()그리고.reset()에서 사용하는 방법while-루프

PHP

PHP루프는 버전 4.0에서 도입되었으며 4.0 베타 [16]4에서 개체와 값으로 호환되었습니다.그러나, PHP 5에서는 내부[17] 기능의 도입을 통해 반복기 지원이 추가되었습니다. Traversable인터페이스입니다.[18]PHP 스크립트에서 구현하기 위한 두 가지 주요 인터페이스. 이 인터페이스를 통해 개체를 반복할 수 있습니다.foreach루프Iterator그리고.IteratorAggregate후자는 구현 클래스가 모든 필수 메서드를 선언할 필요가 없으며 대신 접근자 메서드를 구현합니다.getIterator의 인스턴스를 반환한다.Traversable. Standard PHP Library는 특수 반복기로 [19]작업할 수 있는 여러 클래스를 제공합니다.PHP는 5.5 [20]이후 제너레이터도 지원합니다.

가장 간단한 구현은 배열을 래핑하는 것입니다. 는 유형 힌트 및 정보 숨김에 유용합니다.

네임스페이스 위키피디아\반복기;  최종 학급 어레이 이터레이터 확장 \Iterator {     사적인 배열 $array;      일반의 기능. __개요(배열 $array)     {         $ this->배열 = $array;     }      일반의 기능. 되감다(): 무효     {         메아리치다 '점멸' , PHP_EOL;         리셋($ this->배열);     }      일반의 기능. 현재의()     {         $value($value) = 현재의($ this->배열);         메아리치다 "현재:{$value($value)}", PHP_EOL;         돌아가다 $value($value);     }      일반의 기능. 열쇠()     {          = 열쇠($ this->배열);         메아리치다 「키:{}", PHP_EOL;         돌아가다 ;     }      일반의 기능. 다음 분.()     {         $value($value) = 다음 분.($ this->배열);         메아리치다 "다음:{$value($value)}", PHP_EOL;         돌아가다 $value($value);     }      일반의 기능. 유효한(): 부울     {         $유효. = $ this->현재의() !== 거짓의;         메아리치다 '유효: ', ($유효. ? '진짜' : 'false'), PHP_EOL;         돌아가다 $유효.;     } } 

예 클래스의 모든 메서드는 완전한 foreach 루프 실행 중에 사용됩니다(foreach ($iterator as $key => $current) {}Iterator의 메서드는 다음 순서로 실행됩니다.

  1. $iterator->rewind()내부 구조가 처음부터 시작되도록 합니다.
  2. $iterator->valid()이 예에서는 true를 반환합니다.
  3. $iterator->current()반환된 값은 다음 위치에 저장됩니다.$value.
  4. $iterator->key()반환된 값은 다음 위치에 저장됩니다.$key.
  5. $iterator->next()내부 구조의 다음 요소로 이동합니다.
  6. $iterator->valid()false를 반환하고 루프가 중단됩니다.

다음 예시는 PHP 클래스를 구현하고 있습니다.Traversable인터페이스, 즉 인터페이스, 즉,IteratorIterator데이터가 에 반환되기 전에 데이터에 따라 동작하는 클래스foreachloop. 사용방법과MYSQLI_USE_RESULTconstant를 사용하면 PHP 스크립트가 메모리 사용량이 매우 적은 수십억 행으로 결과 집합을 반복할 수 있습니다.이러한 기능은 PHP 및 MySQL 클래스 구현(예:PDOStatementclass는 다음 명령을 실행합니다.Traversable인터페이스도 있습니다).

mysqli_리포트(MYSQLI_REPORT_ERROR   MYSQLI_REPORT_STRICT); $mysqli = 신규 \mysqli('host.example.com', '실패', '패스워드', 'filename_name');  // 메서드 호출에 의해 반환되는 \mysqli_result 클래스는 내부 Traversable 인터페이스를 구현합니다. 앞지르다 ($mysqli->질문하다('table'에서 'a', 'b', 'c'를 선택합니다., MYSQLI_USE_RESUCT) ~하듯이 $row($row)) {     // 연관 배열인 반환된 행에 대해 작업을 수행합니다. } 

파이썬

Python의 반복기는 언어의 기본 부분이며 많은 경우, 그들이 암묵적으로 사용되고 있기 때문에 보이지 않습니다.for() 문, 목록 포괄생성기 식에 있습니다.Python의 모든 표준 내장 컬렉션 유형은 표준 라이브러리의 일부인 많은 클래스뿐만 아니라 반복을 지원합니다.다음으로 시퀀스에 걸친 일반적인 암묵적 반복 예를 나타냅니다.

위해서 가치  순서:     인쇄물(가치) 

Python 사전(관련 배열의 한 형태)은 사전 키가 반환될 때 직접 반복할 수도 있습니다.items()사전의 메서드는 해당 키와 값의 쌍을 태플로서 생성하는 위치에서 반복할 수 있습니다.

위해서 열쇠  사전:     가치 = 사전[열쇠]     인쇄물(열쇠, 가치) 
위해서 열쇠, 가치  사전.항목들():     인쇄물(열쇠, 가치) 

그러나 반복기를 사용하여 명시적으로 정의할 수 있습니다.반복 가능한 시퀀스 유형 또는 클래스에 대해 내장 함수iter()를 사용하여 반복기 개체를 만듭니다.그런 다음 반복기 개체를 사용하여next()기능, 이 기능은__next__()method internal: 컨테이너 내의 다음 요소를 반환합니다.(앞의 문장은 Python 3.x에 적용됩니다.Python 2.x에서는next()방법은 동일합니다.)aStopIteration요소가 더 이상 남아 있지 않으면 예외가 발생합니다.다음으로 명시적 반복자를 사용하여 시퀀스에 걸쳐 동등한 반복 예를 나타냅니다.

그것 = 반복하다(순서) 하는 동안에 진실의:     해라:         가치 = 그것.다음 분.() Python 2.x의 #         가치 = 다음 분.(그것) Python 3.x의 #     제외하고 정지 반복:         브레이크.     인쇄물(가치) 

모든 사용자 정의 클래스는 표준 반복(암묵적 또는 명시적)을 지원할 수 있습니다.__iter__()반복기 개체를 반환하는 메서드입니다.그런 다음 반복기 개체는 다음과 같이 정의해야 합니다.__next__()다음 요소를 반환하는 메서드입니다.

Python의 생성기는 이 반복 프로토콜을 구현합니다.

라쿠

Raku의 반복자는 언어의 기본 요소이지만, 보통 사용자는 반복자를 신경 쓸 필요가 없습니다.이러한 사용법은 다음과 같은 반복 API 뒤에 숨겨져 있습니다.for진술,map,grep, 목록 색인화.[$idx],기타.

다음 예시는 값 집합에 대한 일반적인 암묵적 반복을 보여 줍니다.

my @values = 1, 2, 3; @values -> $value { say $value } # 출력: # 1 # 2 # 3

Raku 해시를 직접 반복할 수도 있습니다.이를 통해 중요한 가치를 얻을 수 있습니다.Pair물건들.kv해시에서 메서드를 호출하여 키와 값을 반복할 수 있습니다.keys해시의 키를 반복하는 방법 및values해시 값을 반복하는 메서드입니다.

 %word-to-number ='1' > 1, '2' => 2, '3' => 3, %word-to-number -> $word-to-number -> $put: #3 => 3 #1 => 1 #2 > $key value "$"입니다. -> $key {"$key => " ~ %word-to-number {$key};} #출력: #3 => 3 #1 => 1 #2 > 2

그러나 반복기를 사용하여 명시적으로 정의할 수 있습니다.모든 반복 가능한 유형에 대해 반복 프로세스의 다른 측면을 제어하는 몇 가지 방법이 있습니다.예를 들어,iterator메서드는 Return을 반환하도록 되어 있습니다.Iterator오브젝트 및pull-one메서드는 가능하면 다음 값을 생성하여 반환하거나 sentinel 값을 반환하도록 되어 있습니다.IterationEnd값을 더 이상 산출할 수 없는 경우.다음으로 명시적 반복자를 사용한 컬렉션에 대한 동등한 반복 예를 나타냅니다.

my @values = 1, 2, 3; my $itues : = @values.iterator; # $values 루프 { my $values : = $it.pull-one; # grap 반복다음 은 $value =:: RepeatingEnd; # 반복 종료 시 $value; # stoppute; # 출력: 1 #2 #2 #3 #3 #3 #3 #

Raku의 모든 반복 가능한 활자는Iterable역할.Iterator역할, 또는 둘 다.Iterable매우 심플하고 필요한 것은iterator작곡 수업에서 시행해야 합니다.Iterator보다 복잡하여 다음과 같은 일련의 방법을 제공합니다.pull-one이를 통해 항목을 추가 또는 삭제하거나 항목을 건너뛰어 다른 항목에 액세스하는 등 여러 컨텍스트에서 반복 작업을 보다 세밀하게 수행할 수 있습니다.따라서 모든 사용자 정의 클래스는 이러한 역할을 구성하고 구현함으로써 표준 반복을 지원할 수 있습니다.iterator및/또는pull-one방법들.

DNAclass는 DNA 가닥을 나타내며 구현합니다.iterator를 구성함으로써Iterable역할. DNA 가닥은 반복될 때 트리뉴클레오티드 그룹으로 분할됩니다.

{.match(/^^ <[ACGT]> + $/}  .chars %% 3}에서 Str서브셋스트랜드. 클래스 DNA에는 $.chain; 메서드 new(Strand:D $chain) { self.bless: :$chain } 메서드 반복기(DNA:){$.chain.comb.rotor(3.iterator}}.DNA.new('GATTACATA') {.say} #OUTPUT: # (GA T) # (T' C) # (A'new DNA).join('-'); # 출력: # GAT-TAC-ATA

Repeaterclass는 양쪽을 구성합니다.Iterable그리고.Iterator역할:

class Repeater do Iterator { has Any $.tem is required ;Int $.times ;Int $!count = 1 ;multi method new-times, $times) {self 。bless: :$item, :$times;} 메서드 반복기 {self } 메서드 풀원(--> Mu){$!count <= $!times { $!count += 1; return $!times }, repeater.new("Hello", 3) {.say } 출력 # Hello # Hello #: # Hello #

루비

Ruby는 매우 다른 방식으로 반복기를 구현합니다. 모든 반복은 컨테이너 메서드에 콜백 클로저를 전달함으로써 이루어집니다.이렇게 함으로써 Ruby는 기본적인 반복뿐만 아니라 함수 매핑, 필터 및 감소와 같은 여러 패턴의 반복을 구현합니다.Ruby는 기본 반복 방법에 대한 대체 구문도 지원합니다.each다음 3가지 예는 동일합니다.

(0...42).각각 하다  n    놓다 n 끝. 

...그리고...

위해서 n  0...42   놓다 n 끝. 

또는 더 짧다

42.시대 하다  n    놓다 n 끝. 

Ruby는 또한 다음을 사용하여 고정 목록에 대해 반복할 수 있습니다.Enumerator를 호출하거나 둘 중 하나입니다.#next위와 같이 각각에 대해 방법을 지정하거나 a를 수행합니다.

Rust를 사용하면 벡터 요소를 반복하거나 자체 반복기를 만들 수 있습니다.각 리터레이터에는 어댑터가 있습니다(map,filter,skip,take, ...).

위해서 n  0..42 {     프린트!("{}", n); } 

아래쪽에fibonacci()함수는 사용자 지정 반복기를 반환합니다.

위해서 i  파이보나치().건너뛰다.(4).가지고 가다(4) {     프린트!("{}", i); } 

「 」를 참조해 주세요.

레퍼런스

  1. ^ Gatcomb, Joshua. "Understanding and Using Iterators". Perl.com. Archived from the original on 2005-06-16. Retrieved 2012-08-08. A user-defined iterator usually takes the form of a code reference that, when executed, calculates the next item in a list and returns it. When the iterator reaches the end of the list, it returns an agreed-upon value.
  2. ^ a b Watt, Stephen M. "A Technique for Generic Iteration and Its Optimization" (PDF). The University of Western Ontario, Department of Computer Science. Archived from the original (PDF) on 2006-09-16. Retrieved 2012-08-08. Iterators were introduced as constructs to allow looping over abstract data structures without revealing their internal representation.
  3. ^ Alex Allain. "STL Iterators". Cprogramming.com - Your resource for C and C++. Retrieved 2012-08-08. You can think of an iterator as pointing to an item that is part of a larger container of items.
  4. ^ a b "Difference between an external iterator and an internal iterator". CareerRide.COM. 2009-04-03. Archived from the original on 2009-04-03. Retrieved 2012-08-08. An internal iterator is implemented by the member functions of the class which has the iteration logic. An external iterator is implemented by a separate class which can be attached to the object which has iteration logic. The advantage of external iterator is that, many iterators can be made active simultaneously on the existing or same object.
  5. ^ Watt, Stephen M. "A Technique for Generic Iteration and Its Optimization" (PDF). The University of Western Ontario, Department of Computer Science. Archived from the original (PDF) on 2006-09-16. Retrieved 2012-08-08. Some authors use the term iterator, and others the term generator. Some make subtle distinctions between the two.
  6. ^ a b Freeman, Eric; Freeman, Elisabeth; Kathy, Sierra; Bert, Bates (2004). Hendrickson, Mike; Loukides, Mike (eds.). Head First Design Patterns (paperback). Vol. 1. O'REILLY. p. 338. ISBN 978-0-596-00712-6. Retrieved 2012-08-09.
  7. ^ "Glossary — Python 3.8.4 documentation". Retrieved 2020-07-15.
  8. ^ Vecerina, Ivan (2006-02-01). "index vs iterator". BYTES. Archived from the original on 2006-02-01. Retrieved 2012-08-08. An index only can be used for containers that (efficiently) support random access (i.e. direct access to an element at a given position). An iterator is a more general concept. Iterators offer efficient traversal of linked lists, files, and a number of other data structures. It often leads to the generation of more efficient code.
  9. ^ Kevin Waterson. "C++ Iteratoren: Iterator-Kategorien" (in German). cppreference.com. Retrieved 2012-08-09.
  10. ^ Kevin Waterson. "Iterators: Concepts". sgi. Retrieved 2012-08-09.
  11. ^ larsmans (2011-03-06). "Types of iterator: Output vs. input vs. forward vs. random access iterator". stackoverflow. Archived from the original on 2011-03-06. Retrieved 2012-08-09.
  12. ^ Kevin Waterson. "Introduction to SPL: Introduction to Standard PHP Library (SPL)". PHPRO.ORG. Retrieved 2012-08-09.
  13. ^ Collier, Andrew. "Iterators in R". Archived from the original on 18 October 2018. Retrieved 16 November 2013.
  14. ^ "concurrent_unordered_set Template Class". Intel Threading Building Blocks for Open Source. Archived from the original on 2015-05-01. Retrieved 2012-08-09. •The iterator types iterator and const_iterator are of the forward iterator category
  15. ^ "java.util: Interface Iterator<E>: Method Summary". Oracle. Retrieved 2012-08-08.
  16. ^ "PHP 4 ChangeLog". The PHP Group. 2000-02-20. Retrieved 2015-10-13.
  17. ^ Internal은 인터페이스가 C(프로그래밍 언어) 소스에서만 PHP 스크립트로 구현될 수 없다는 사실을 의미합니다.
  18. ^ "The Traversable interface". The PHP Group. Retrieved 2015-10-13.
  19. ^ "Iterators". The PHP Group. Retrieved 2015-10-13.
  20. ^ "PHP 5 ChangeLog". The PHP Group. 2013-06-20. Retrieved 2015-10-13.

외부 링크