본문 바로가기
카테고리 없음

[C++]Design Pattern - Iterator Adapter

by Mulder5 2020. 12. 30.
반응형

Iterator Adapter

기존 반복자의 동작을 거꾸로 동작하게 하는 어댑터
다양한 알고리즘을 역순으로 적용할 수 있다

#include <iostream>
#include <algorithm>
#include <list>

using namespace std;

int main()
{
    list<int> s = { 1,2,3,4 };

    auto p1 = s.begin();
    auto p2 = s.end();

    for_each(p1, p2, [](int a) { cout << a << endl; });
    // 1 2 3 4 출력
    // 거꾸로 출력 하려면 어떻게?
    
}

위의 예제에서 list s를 출력하면 1 2 3 4 가 줄 바꿈 되어 출력된다. 이를 거꾸로 출력해본다.

단순히 이렇게 하면 되지 않을까?

for_each(p2, p1, [](int a) { cout << a << endl; });

역시 문제가 있다. 반복자가 ++될때 앞으로 간다. 반복자 p2에서 -- 되며 뒤로 가야 한다.

이를 위해 다음과 같이 reverse_iterator를 사용한다.

reverse_iterator<list<int>::iterator> p3(p2); // --p2로 초기화
reverse_iterator<list<int>::iterator> p4(p1); // --p1으로 초기화

for_each(p3, p4, [](int a) { cout << a << endl; });

이렇게 구현되었다면 원했던 결과를 얻을 수 있다. 다만 한번 더 이를 간결하게 사용해본다면 아래와 같다.

auto p5 = make_reverse_iterator(p2);
auto p6 = make_reverse_iterator(p1);

for_each(p5, p6, [](int a) { cout << a << endl; });

이젠 컨테이너 타입을 명시해주지 않아도 p1, p2의 타입으로 자동 추론되어 표현이 훨씬 간결해졌다.

반응형