..

Search

66) 반복자의 종류

66) 반복자의 종류

반복자의 종류


반복자의 종류

STL은 제공하는 기능에 따라 반복자를 다음과 같이 다섯 가지로 분류하고 있습니다.

 

1. 입력 반복자(input iterator)

2. 출력 반복자(output iterator)

3. 순방향 반복자(forward iterator)

4. 양방향 반복자(bidirectional iterator)

5. 임의 접근 반복자(random access iterator)


입력 반복자(input iterator)

입력 반복자(input iterator)는 가장 단순한 형태의 반복자로, 컨테이너로부터 값을 읽는 데 사용됩니다.

입력 반복자를 사용하면 컨테이너로부터 값을 읽을 수는 있지만, 프로그램이 그 값을 변경할 수는 없습니다.

따라서 이 반복자는 읽기 전용 알고리즘에 사용할 수 있습니다.

 

입력 반복자는 증가 연산자(++)를 사용하여 순방향으로만 이동할 수 있습니다.

또한, 참조 연산자(*)를 사용하여 반복해서 요소를 참조할 수 있습니다.

 

다음 예제는 순차 검색을 통해 컨테이너에 포함된 특정 값을 찾아내는 Find() 함수의 원형을 보여줍니다.

예제

template<class InputIterator, class T>

InputIterator Find(InputIterator first, InputIterator last, const T& value);


출력 반복자(output iterator)

출력 반복자(output iterator)는 입력 반복자와는 반대로 컨테이너의 값을 변경하는 데 사용됩니다.

출력 반복자를 사용하면 컨테이너의 값을 변경할 수는 있지만, 프로그램에서 값을 읽을 수는 없습니다.

따라서 이 반복자는 쓰기 전용 알고리즘에 사용할 수 있습니다.

 

출력 반복자는 증가 연산자(++)를 사용하여 순방향으로만 이동할 수 있습니다.

또한, 참조 연산자(*)를 사용하여 단 한 번만 요소에 값을 쓸 수 있습니다.

 

다음 예제는 한 컨테이너에서 다른 컨테이너로 값을 복사하는 Copy() 함수의 원형을 보여줍니다.

예제

template<class InputIterator, class OutputIterator>

OutputIterator Copy(InputIterator first, InputIterator last, OutputIterator result);

 

입력 반복자와 출력 반복자는 입출력 스트림에만 적용됩니다.

순방향 반복자(forward iterator)

순방향 반복자(forward iterator)는 입출력이 모두 가능한 반복자입니다.

따라서 이 반복자는 다중 패스 알고리즘에 사용할 수 있습니다.

 

순방향 반복자는 증가 연산자(++)를 사용하여 순방향으로만 이동할 수 있습니다.

또한, 참조 연산자(*)를 사용하여 몇 번이고 반복해서 같은 요소를 참조하거나, 그 값을 변경할 수 있습니다.

즉 순방향 반복자는 입력 반복자와 출력 반복자의 기능을 모두 포함하고 있습니다.

 

다음 예제는 특정 값을 찾아 다른 값으로 변경하는 Replace() 함수의 원형을 보여줍니다.

예제

template<class ForwardIterator, class T>

void Replace(ForwardIterator first, ForwardIterator last, const T& target, const T& replacement);


양방향 반복자(bidirectional iterator)

양방향 반복자(bidirectional iterator)는 입출력이 모두 가능한 반복자입니다.

 

양방향 반복자는 증가 연산자(++)를 사용하면 순방향으로, 감소 연산자(--)를 사용하면 역방향으로도 이동할 수 있습니다.

또한, 참조 연산자(*)를 사용하여 몇 번이고 반복해서 같은 요소를 참조하거나, 그 값을 변경할 수 있습니다.

즉 양방향 반복자는 순방향 반복자의 기능을 모두 포함하고 있습니다.

 

다음 예제는 특정 컨테이너의 모든 값을 거꾸로 새로운 컨테이너에 옮기는 Reverse() 함수의 원형을 보여줍니다.

예제

template<class BidirectionalIterator, class OutputIterator>

OutputIterator Reverse(BidirectionalIterator first, BidirectionalIterator last, OutputIterator result);


임의 접근 반복자(random access iterator)

임의 접근 반복자(random access iterator)는 최상위 레벨의 반복자로서 가장 많은 기능을 제공합니다.

 

임의 접근 반복자는 양방향 반복자의 모든 기능을 포함하고 있으며, 첨자 연산자([])를 통해 임의의 요소에 접근할 수 있습니다.

또한, 증감 연산자를 통해 양방향으로 이동할 수 있으며, 요소의 순서를 결정하기 위해 관계 연산자를 사용할 수 있습니다.

즉 임의 접근 반복자는 양방향 반복자의 모든 기능과 함께 기존의 일반 포인터가 하는 거의 모든 일을 할 수 있습니다.

 

다음 예제는 특정 컨테이너의 모든 값을 정렬시키는 Sort() 함수의 원형을 보여줍니다.

예제

template<class RandomAccessIterator>

void Sort(RandomAccessIterator first, RandomAccessIterator last);


반복자 계층

STL의 반복자(iterator)는 계층적으로 분류됩니다.

예를 들어, 순방향 반복자는 입력 반복자와 출력 반복자의 모든 기능을 포함하고 거기에 자신만의 기능을 추가합니다.

 

이렇게 다양한 반복자를 사용하는 이유는 알고리즘의 적용 조건을 제한하기 위해서입니다.

즉, 양방향 반복자는 임의 접근 반복자에 기초하는 알고리즘은 사용할 수 없지만, 자신보다 하위 계층의 반복자에 기초하는 알고리즘은 사용할 수 있는 것입니다.

 

다음 표는 STL 주요 반복자의 기능을 계층 순으로 정리한 것입니다.

반복자의 기능 입력 출력 순방향 양방향 임의 접근
접근(->) X
읽기(*) X
쓰기(*) X
증가 연산자(++)
감소 연산자(--) X X X
첨자 연산자([]) X X X X
산술 연산자(+, -) X X X X
산술 대입 연산자(+=, -=) X X X X
관계 연산자(<, <=, >, >=) X X X X

연습문제