비디오: Is Programming just about the Tools? 2024
C ++ 프로그래머는 각 요소의 인덱스를 제공하여 배열을 반복합니다. 그러나이 기술은 임의 액세스를 허용하지 않는 list 와 같은 컨테이너에서는 작동하지 않습니다. getFirst () 및 getNext () 와 같은 메소드를 기반으로하는 솔루션을 상상할 수 있습니다. 그러나 표준 템플릿 라이브러리의 설계자는 모든 유형의 컨테이너를 트래버스하는 공통 방법을 제공하고자했습니다.
표준 템플릿 라이브러리는 이터레이터를 정의합니다.
반복자 는 컨테이너의 멤버를 가리키는 객체입니다. 일반적으로 모든 반복기는 다음 함수를 지원합니다.
-
클래스는 컬렉션의 첫 번째 멤버를 가리키는 반복자를 반환 할 수 있습니다.
-
반복자는 한 구성원에서 다음 구성원으로 이동할 수 있습니다.
-
반복자는 목록의 끝에 도달하면 표시를 반환합니다.
-
프로그램은 반복자가 가리키는 요소를 검색 할 수 있습니다.
표준 템플릿 라이브러리는 역순으로리스트를 뒤적으로 옮길 수있는 역 반복자도 제공합니다. iterator에 관한 모든 것은 reverse iterator에 똑같이 적용됩니다.
리스트 를 반복하는 데 필요한 코드는 벡터 (두 가지 예를 든다)를 통과하는 데 필요한 코드와 다릅니다. 그러나 반복자는 이러한 세부 사항을 숨 깁니다.
begin () 메소드는리스트의 첫 번째 요소를 가리키는 반복자를 반환한다. 간접 연산자 * ()는 반복자가 가리키는 객체에 대한 참조를 가져옵니다. ++ 연산자는 반복자를 목록의 다음 요소로 이동합니다.
반복자가 end () 에 의해 반환 된 값과 같을 때까지 프로그램은 목록을 통해 계속 증가합니다. 다음 코드 스 니펫은 학생 목록 시작 부분에서 시작하여 각 이름을 표시합니다.
void displayStudents (list & students) {// 목록 목록의 첫 번째 // 요소를 가리키는 반복자를 할당합니다.:: 반복자 iter = 학생. 시작 (); // iterator가리스트의 끝에 도달 할 때까지리스트를 반복한다 while (iter! = students.end ()) {// iterator가 Student를 찾는다 Student s = * iter; cout << s. sName << endl; // iterator를 다음 요소로 옮깁니다 // iter ++;}}
반복자에 대한 선언은 매우 복잡 할 수 있습니다. 이것은 아마도 '11 표준으로 소개 된 auto 선언을위한 가장 좋은 설명 일 것이다. (auto iter = students. begin (); iter! = students. end (); iter ++) {cout
이것은 메소드리스트에 의해 리턴 된 모든 타입의 반복자로 iter를 선언한다.: begin (), 는 이전 코드 스 니펫에 나타난 고문 선언을 피한다.얼마나 멋진가!