이번 글에서는 C++의 양방향 반복자(Bidirectional Iterator)에 대해 자세히 알아보겠습니다.
양방향 반복자란?
- 양방향 반복자는 순방향 반복자(Forward Iterator)의 모든 기능을 지원하며, 여기에 전위(prefix) 및 후위(postfix) 감소 연산자(
--)까지 추가로 제공합니다. - 이름 그대로 컨테이너의 요소를 양쪽 방향, 즉 끝을 향해(순방향)도, 시작을 향해(역방향)도 이동하며 접근할 수 있습니다.
- 임의 접근 반복자(Random Access Iterator) 역시 양방향 반복자의 한 종류입니다.
- 순방향 반복자와 거의 동일한 특성을 가지지만, 결정적인 차이는 감소(decrement)가 가능하다는 점입니다.
양방향 반복자의 주요 속성
양방향 반복자는 다음과 같은 속성들을 만족해야 합니다.
| 속성 | 표현식 |
|---|---|
| 기본 생성(default-constructible), 복사 대입(copy-assignable), 소멸(destructible)이 모두 가능합니다. | A p;A q(p);q = p; |
| 동등 연산자와 비동등 연산자를 사용하여 두 반복자를 비교할 수 있습니다. | p == qp != q |
역참조(dereference)가 가능합니다. 역참조 연산자(*)를 사용해 값을 읽어올 수 있습니다. | *p |
| 변경 가능한(mutable) 반복자는 lvalue로서 역참조하여 값을 수정할 수 있습니다. | *p = t |
증가 연산자(++)와 감소 연산자(--)를 사용해 앞뒤로 이동할 수 있습니다. | p++q-- |
예제 코드
아래 예제는 std::vector에서 정방향 반복자와 역방향 반복자(reverse_iterator)를 사용하여 요소를 출력하는 코드입니다.
#include <iostream>
#include <iterator>
#include <vector>
using namespace std;
int main() {
vector<int> vec{10, 20, 30, 40, 50, 60, 70, 80, 90, 100};
vector<int>::iterator it;
vector<int>::reverse_iterator rev_it;
// 정방향으로 순회
for (it = vec.begin(); it != vec.end(); it++)
cout << *it << " ";
cout << endl;
// 역방향으로 순회
for (rev_it = vec.rbegin(); rev_it != vec.rend(); rev_it++)
cout << *rev_it << " ";
}실행 결과
10 20 30 40 50 60 70 80 90 100 100 90 80 70 60 50 40 30 20 10
첫 번째 줄은 begin()부터 end()까지 정방향 반복자로 순회한 결과이고, 두 번째 줄은 rbegin()부터 rend()까지 역방향 반복자로 순회한 결과입니다. 이처럼 양방향 반복자는 컨테이너를 유연하게 탐색할 수 있게 해주는 강력한 도구입니다.