iterator
반복자는 포인터와 비슷하다. 반복자는 컨테이너에 저장되어 있는 일부 요소를 가리키며, 해당 범위의 요소를 반복할 수 있는 객체이다. 반복자를 사용하여 어떤 컨테이너에 접근하든 동일한 방법으로 접근할 수 있다. 예를 들어, vector는 연속된 메모리 공간을 가지고 있어서 인덱스 연산으로 임의 접근이 가능하고, 증가시키며 순회도 가능하다. 하지만 list의 경우에는 연속된 메모리 공간을 가지고 있지 않고, 현재 가리키고 있는 노드에서 다음 노드의 주소로 갱신하는 방식으로 순회를 진행한다. 이렇게 컨테이너마다 요소에 접근하는 방식이 다르므로 반복자를 사용하여 컨테이너의 내부 구조를 몰라도 어떤 컨테이너든지 통일된 인터페이스를 가지게 된다.
iterator categories
포인터는 반복자의 한 형태이지만 모든 반복자가 포인터의 동일한 기능을 가지지 않는다. 반복자가 지원하는 속성에 따라 5가지 범주로 분류된다.
- 입력 반복자 (Input) : 순차 입력 작업에 사용할 수 있는 반복자이며, 반복자가 가리키는 각 값은 한번 읽은 다음 반복자가 증가한다.
- 출력 반복자 (Output) : 순차 출력 작업에 사용할 수 있는 반복자이며, 반복자가 가리키는 각 값은 한번 쓴 다음 반복자가 증가한다.
- 순방향 반복자 (Forward) : 시작에서 끝으로 가는 방향으로 범위의 요소 시퀀스에 엑세스하는 데 사용할 수 있는 반복자이다. 여러 복사본을 사용하여 동일한 반복자 값을 두번 이산 전달할 수 있다. 증가만 지원하고 감소는 지원하지 않는다.
- 양방향 반복자 (Bidirectional) : 범위의 요소 시퀀스에 양방향으로 액세스하는 데 사용할 수 있는 반복자이다. 순방향 반복자와 동일한 속성을 가지며 감소할 수 있다.
- 임의 엑세스 반복자 (Random access) : 어떠한 요소의 위치에서 임의 오프셋 위치에 있는 요소에 접근할 수 있다.
iterator range
range란 컨테이너에 담긴 값들의 시퀀스를 말한다. 한 쌍의 반복자는 이 시퀀스의 시작과 끝을 가리켜서 값들의 구간을 설정하는데 사용될 수 있다. 두개의 반복자는 같은 컨테이너로부터 생성되어야 하며, 첫번째 반복자는 두번째 반복자의 앞에 와야한다.
end()
end 함수는 컨테이너의 마지막 반복자를 생성하기 위해 호출된다. 이 반복자는 컨테이너의 마지막 원소를 가리키지 않고, 마지막 원소의 다음 공간을 가리킨다. 아무 의미가 없는 공간을 가리키고 있으므로 참조하면 오류가 발생된다.