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

C++ 양방향 반복자(Bidirectional Iterator)의 개념과 활용법

이번 글에서는 C++의 양방향 반복자(Bidirectional Iterator)에 대해 자세히 알아보겠습니다.

양방향 반복자란?

  • 양방향 반복자는 순방향 반복자(Forward Iterator)의 모든 기능을 지원하며, 여기에 전위(prefix) 및 후위(postfix) 감소 연산자(--)까지 추가로 제공합니다.
  • 이름 그대로 컨테이너의 요소를 양쪽 방향, 즉 끝을 향해(순방향)도, 시작을 향해(역방향)도 이동하며 접근할 수 있습니다.
  • 임의 접근 반복자(Random Access Iterator) 역시 양방향 반복자의 한 종류입니다.
  • 순방향 반복자와 거의 동일한 특성을 가지지만, 결정적인 차이는 감소(decrement)가 가능하다는 점입니다.

양방향 반복자의 주요 속성

양방향 반복자는 다음과 같은 속성들을 만족해야 합니다.

속성표현식
기본 생성(default-constructible), 복사 대입(copy-assignable), 소멸(destructible)이 모두 가능합니다.A p;
A q(p);
q = p;
동등 연산자와 비동등 연산자를 사용하여 두 반복자를 비교할 수 있습니다.p == q
p != 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()까지 역방향 반복자로 순회한 결과입니다. 이처럼 양방향 반복자는 컨테이너를 유연하게 탐색할 수 있게 해주는 강력한 도구입니다.