Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ 양방향 반복자(Bidirectional Iterator) 완벽 가이드


컨테이너의 요소 시퀀스를 끝 방향과 시작 방향, 양쪽 모두에서 탐색할 수 있는 권한을 가진 반복자를 양방향 반복자(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