1.6 반복자
앞에서 배열과 벡터를 설명할 때 반복자에 숫자를 더하여 사용한 것을 기억할 것입니다. 반복자는 포인터와 비슷하지만, STL 컨테이너에 대해 공통의 인터페이스를 제공합니다. 반복자를 이용한 연산은 어떤 컨테이너에서 정의된 반복자인지에 따라 결정됩니다. 벡터와 배열에서 사용되는 반복자는 기능 면에서 가장 유연합니다. 벡터와 배열은 연속된 자료 구조를 사용하기 때문에 특정 위치의 원소에 곧바로 접근할 수 있습니다. 이러한 반복자를 임의 접근 반복자(random access iterator)라고 합니다. 그러나 std::forward_list의 경우 기본적으로 역방향으로 이동하는 기능을 제공하지 않으며, 바로 이전 노드로 이동하려면 맨 처음 노드부터 시작해서 찾아가야 합니다. 따라서 std::forward_list에서는 증가 연산만 가능하며, 이러한 반복자를 순방향 반복자(forward iterator)라고 합니다.
반복자 타입에 따라 사용할 수 있는 함수 중에 advance(), next(), prev() 함수에 대해 알아보겠습니다. advance() 함수는 반복자와 거리 값을 인자로 받고, 반복자를 거리 값만큼 증가시킵니다. next()와 prev() 함수도 반복자와 거리 값을 인자로 받고, 해당 반복자에서 지정한 거리만큼 떨어진 위치의 반복자를 반환합니다. 이들 함수는 해당 반복자가 지원할 경우에만 동작합니다. 예를 들어 순방향으로만 이동 가능한 순방향 반복자에 대해 prev() 함수를 사용하면 에러가 발생합니다. 이들 함수의 동작 시간은 반복자 타입에 따라 결정됩니다. 예를 들어 임의 접근 반복자에서는 덧셈 또는 뺄셈이 상수 시간으로 동작하므로 next(), prev() 등의 함수도 상수 시간으로 동작합니다. 나머지 타입의 반복자에서는 주어진 거리만큼 순방향 또는 역방향으로 이동해야 하기 때문에 선형 시간이 소요됩니다. 다음 연습 문제에서 이러한 반복자 사용 방법에 대해 알아보겠습니다.