반복기

반복기는 C++ 표준 라이브러리 컨테이너에 있는 요소를 반복하고 개별 요소에 대한 액세스를 제공할 수 있는 개체입니다. C++ 표준 라이브러리 컨테이너는 모두 반복기를 제공하므로 요소가 저장되는 컨테이너 형식을 확인하지 않고도 알고리즘에서 표준 방식으로 해당 요소에 액세스할 수 있습니다.

멤버 및 전역 함수(예: begin()end() 및 연산자) ++-- 를 사용하여 반복기를 명시적으로 사용하고 앞으로 또는 뒤로 이동할 수 있습니다. range-for 루프 또는 (일부 반복기 형식의 경우) 아래 첨자 연산 []자와 함께 반복기를 암시적으로 사용할 수도 있습니다.

C++ 표준 라이브러리에서 시퀀스 또는 범위의 시작 부분이 첫 번째 요소입니다. 시퀀스 또는 범위의 끝 부분은 항상 마지막 요소 다음의 요소로 정의됩니다. 전역 함수는 beginend 지정된 컨테이너에 반복기를 반환합니다. 컨테이너의 모든 요소에 한 일반적인 명시적 반복기 루프 모양은 다음과 같습니다.

vector<int> vec{ 0,1,2,3,4 };
for (auto it = begin(vec); it != end(vec); it++)
{
    // Access element using dereference operator
    cout << *it << " ";
}

range-for 루프를 사용하여 이 작업을 다 간단하게 수행할 수 있습니다.

for (auto num : vec)
{
    // no dereference operator
    cout << num << " ";
}

반복기에는 5가지 범주가 있습니다. 범주는 증가하는 거듭제곱 순으로 다음과 같습니다.

  • 출력. 출력 반복기는 연산자를X 사용하여 ++ 시퀀스를 반복할 수 있으며 연산자를 사용하여 * 요소를 한 번만 작성할 수 있습니다.

  • 입력. 입력 반복기는 연산자를X 사용하여 ++ 시퀀스를 반복할 수 있으며 연산자를 사용하여 * 요소를 횟수에 따라 읽을 수 있습니다. 및 != 연산자를 사용하여 == 입력 반복기를 비교할 수 있습니다. 입력 반복기의 복사본을 증가한 후에는 다른 복사본을 안전하게 비교, 역참조 또는 증가시킬 수 없습니다.

  • 전달. 정방향 반복기는 ++ 연산자를X 사용하여 시퀀스를 반복할 수 있으며 모든 요소를 읽거나 연산자를 사용하여 * 횟수에 관계없이 const가 아닌 요소를 쓸 수 있습니다. 연산자를 사용하여 -> 요소 멤버에 액세스하고 및 연산자를 사용하여 ==!= 정방향 반복기를 비교할 수 있습니다. 정방향 반복기 복사본을 여러 개 만들어 각각을 독립적으로 역참조하고 증가시킬 수 있습니다. 컨테이너에 대한 참조 없이 초기화된 전달 반복기를 null 전달 반복기라고 합니다. Null 정방향 반복기는 항상 동일한지 비교됩니다.

  • 양방향. 양방향 반복기는X 앞으로 반복기를 대신할 수 있습니다. 그러나 양방향 반복기(예: --X, X--또는 (V = *X--))를 감소할 수도 있습니다. 요소 멤버에 액세스할 수 있고, 정방향 반복기와 동일한 방식으로 양방향 반복기를 비교할 수 있습니다.

  • 임의 액세스. 임의 액세스 반복기는X 양방향 반복기를 대신할 수 있습니다. 임의 액세스 반복기를 사용하면 아래 첨자 연산 [] 자를 사용하여 요소에 액세스할 수 있습니다. , -+=-= 연산자를 사용하여 +지정된 수의 요소를 앞으로 또는 뒤로 이동하고 반복기 사이의 거리를 계산할 수 있습니다. , !=, <=<>>=.를 사용하여 ==양방향 반복기를 비교할 수 있습니다.

모든 반복기는 할당하거나 복사할 수 있습니다. 경량 개체로 간주되며 참조가 아닌 값으로 전달되고 반환되는 경우가 많습니다. 또한 앞에서 설명한 모든 연산은 유효한 반복기에서 수행될 경우 예외를 throw하지 않습니다.

반복기 범주의 계층 구조는 세 가지 시퀀스를 표시하여 요약할 수 있습니다. 시퀀스에 대한 쓰기 전용 액세스의 경우 다음을 사용할 수 있습니다.

출력 반복기
-> 전달 반복기
-> 양방향 반복기
-> 임의 액세스 반복기

오른쪽 화살표는 "바꿀 수 있습니다."를 의미합니다. 출력 반복기를 호출하는 모든 알고리즘은 앞으로 반복기에서 잘 작동해야 합니다( 예 : 다른 방법은 아님 ).

시퀀스에 대한 읽기 전용 액세스의 경우 다음을 사용할 수 있습니다.

입력 반복기
-> 전달 반복기
-> 양방향 반복기
-> 임의 액세스 반복기

이 경우 입력 반복기는 모든 범주 중에서 가장 약합니다.

마지막으로 시퀀스에 대한 읽기/쓰기 권한의 경우 다음을 사용할 수 있습니다.

전달 반복기
-> 양방향 반복기
-> 임의 액세스 반복기

개체 포인터는 항상 임의 액세스 반복기로 사용할 수 있으므로 지정된 시퀀스에 대해 적절한 읽기/쓰기 권한을 지원하는 경우 모든 범주의 반복기로 사용할 수 있습니다.

개체 포인터가 아닌 반복기 Iterator는 특수화 iterator_traits<Iterator>에 필요한 멤버 형식도 정의해야 합니다. 이러한 요구 사항은 공용 기본 클래스 반복기에서 파생하여 Iterator 충족할 수 있습니다.

C++ 표준 라이브러리의 컨테이너 및 알고리즘에서 반복기를 사용하는 방법을 확인하려면 각 반복기 범주의 약속 및 제한 사항을 이해하는 것이 중요합니다.

참고 항목

range-for 루프를 사용하여 반복기를 명시적으로 사용하지 않도록 할 수 있습니다. 자세한 내용은 문에 대한 범위 기반을 참조 하세요.

이제 Microsoft C++는 컨테이너의 범위를 덮어쓰지 않도록 검사 반복기 및 디버그 반복기를 제공합니다. 자세한 내용은 확인된 반복기디버그 반복기 지원을 참조하세요.

참고 항목

C++ 표준 라이브러리 참조
C++ 표준 라이브러리의 스레드 보안