컨테이너의 요소 시퀀스를 끝 방향과 시작 방향, 양쪽 모두에서 탐색할 수 있는 권한을 가진 반복자를 양방향 반복자(Bidirectional Iterator)라고 합니다. 양방향 반복자는 list, map, set과 같은 자료구조에서 활용할 수 있습니다.
양방향 반복자는 순방향 반복자(Forward Iterator)와 동일한 속성을 모두 갖추고 있으며, 유일한 차이점은 감소(--) 연산도 수행할 수 있다는 점입니다.
양방향 반복자의 주요 속성
| 속성 | 유효한 표현식 |
|---|---|
| 기본 생성, 복사 생성, 복사 대입 및 소멸이 가능합니다. |
X a; X b(a); b = a; |
| 동등/부등 연산자를 사용해 동등성을 비교할 수 있습니다. (두 반복자 값이 동일한 기반 시퀀스를 순회할 때만 의미가 있습니다.) | a == b a != b |
| rvalue로 역참조할 수 있습니다. (역참조 가능한 상태일 경우) | *a a->m |
| 가변 반복자(비상수 반복자)인 경우: lvalue로 역참조할 수 있습니다. (역참조 가능한 상태일 경우) | *a = t |
| 증가할 수 있습니다. (역참조 가능한 상태일 경우) 결과는 역참조 가능한 반복자이거나 past-the-end(끝 다음) 반복자입니다. 서로 같다고 비교된 두 반복자는 모두 증가한 후에도 계속 같다고 비교됩니다. | ++a a++ *a++ |
| 감소할 수 있습니다. (그 앞에 역참조 가능한 반복자 값이 존재하는 경우) | --a a-- *a-- |
| Lvalue는 서로 교환(swap)할 수 있습니다. | swap(a,b) |
여기서 X는 양방향 반복자 타입이며, a와 b는 해당 반복자 타입의 객체, t는 반복자 타입이 가리키는 타입의 객체(또는 X 타입 객체를 역참조하여 반환되는 lvalue에 대입할 수 있는 다른 타입의 객체)를 의미합니다.
C++에서 양방향 반복자의 핵심 개념
양방향 반복자는 순방향 반복자의 모든 기능을 지원하며, 여기에 전위(prefix) 및 후위(postfix) 감소 연산자까지 추가로 지원합니다.
이 반복자는 끝 방향과 시작 방향, 두 방향 모두로 요소에 접근할 수 있습니다.
임의 접근 반복자(Random Access Iterator) 역시 양방향 반복자의 한 종류입니다.
양방향 반복자는 순방향 반복자의 모든 특징을 가지지만, 유일한 차이점은 감소 연산도 가능하다는 점입니다.
입력: 1 2 3 4 5 6 7 8 9 10 출력: 10 9 8 7 6 5 4 3 2 1
예제 코드
아래 예제는 vector 컨테이너를 일반 반복자로 순방향 탐색하고, 역방향 반복자(reverse_iterator)로 역방향 탐색하는 방법을 보여줍니다.
#include <iostream>
#include<iterator>
#include<vector>
using namespace std;
int main() {
vector<int> vec{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
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<<" ";
}
실행 결과
1 2 3 4 5 6 7 8 9 10 10 9 8 7 6 5 4 3 2 1