반응형
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의 타입으로 자동 추론되어 표현이 훨씬 간결해졌다.
반응형