반복자의 개념
반복자(Iterator)는 STL의 핵심 개념 중 하나로, 컨테이너의 요소에 접근하고 순회하는 일반화된 방법을 제공합니다.
포인터와 유사하게 동작하지만, 더 추상화되어 있어 다양한 컨테이너에 대해 일관된 인터페이스를 제공합니다.
반복자의 주요 특징
- 컨테이너와 알고리즘을 연결하는 다리 역할
- 포인터와 유사한 동작 (
*
, ->
, ++
, --
등의 연산자 지원)
- 컨테이너의 종류에 관계없이 일관된 사용법 제공
반복자의 종류
STL은 다섯 가지 주요 반복자 카테고리를 정의합니다.
- 입력 반복자 (Input Iterator) : 읽기 전용, 순방향 이동만 가능
- 출력 반복자 (Output Iterator) : 쓰기 전용, 순방향 이동만 가능
- 순방향 반복자 (Forward Iterator) : 읽기/쓰기 가능, 순방향 이동
- 양방향 반복자 (Bidirectional Iterator) : 읽기/쓰기 가능, 양방향 이동
- 임의 접근 반복자 (Random Access Iterator) : 읽기/쓰기 가능, 임의 접근
각 카테고리는 이전 카테고리의 기능을 포함하며 추가적인 기능을 제공합니다.
반복자 연산
주요 반복자 연산을 살펴보겠습니다.
컨테이너와 반복자
대부분의 STL 컨테이너는 다음과 같은 반복자 관련 멤버 함수를 제공합니다.
반복자를 사용한 컨테이너 순회
다양한 방법으로 컨테이너를 순회해보겠습니다.
반복자와 알고리즘
STL 알고리즘은 반복자를 사용하여 컨테이너의 요소에 접근합니다.
이를 통해 알고리즘이 특정 컨테이너에 종속되지 않고 일반화될 수 있습니다.
예제 : std::find
와 std::sort
알고리즘 사용
반복자의 무효화
컨테이너의 내용이 변경될 때 기존 반복자가 무효화될 수 있습니다.
이는 특히 동적 할당을 사용하는 컨테이너(예 : vector)에서 주의해야 합니다.
사용자 정의 반복자
사용자 정의 컨테이너를 만들 때, 해당 컨테이너에 대한 반복자를 직접 구현할 수 있습니다.
다음은 간단한 링크드 리스트와 그에 대한 반복자의 예입니다.
연습 문제
vector<int>
를 생성하고, 반복자를 사용하여 모든 짝수 요소를 제거하는 프로그램을 작성하세요.
list<string>
을 만들고, 사용자로부터 입력받은 문자열을 알파벳 순서에 맞게 삽입하는 프로그램을 작성하세요. 반복자를 사용하여 적절한 삽입 위치를 찾으세요.
map<string, int>
을 사용하여 단어의 빈도수를 세는 프로그램을 작성하세요. 반복자를 사용하여 모든 단어와 그 빈도수를 출력하세요..
참고자료