[STL] 역방향 반복자 (reverse_iterator)

2019. 7. 30. 00:21 기타/C++ STL

[STL] 역방향 반복자 (reverse_iterator)


기본 iterator에 반복자 어댑터 reverse_iterator 를 이용해 정방향 반복자를 역방향 반복자로 변환할 수 있다.


2019/07/30 - [기타/C++ STL] - [STL] 반복자 iterator 개념 및 예제



역방향 반복자(reverse_iterator)는 ++ , -- 시에 정방향 반복자와 반대로 동작한다.


vector<int>::reverse_iterator riter(v.rbegin());


reverse_iterator의 기본 선언이다.

기존 iterator 선언 방식에 어댑터를 사용하여 reverse_iterator로 감싸고 있으며, vector에서 rbegin()을 시작 지점으로 가리킨다.


마찬가지로 역방향 반복자가 종료되는 지점은 v.rend()가 된다.


#include <iostream>
#include <vector>
using namespace std;

int main(){

    vector<int> v;

    v.push_back(10);
    v.push_back(20);
    v.push_back(30);
    v.push_back(40);
    v.push_back(50);

    for (vector<int>::iterator iter = v.begin(); iter != v.end(); iter++)
        cout << *iter << " ";
    cout << endl;

    vector<int>::reverse_iterator riter(v.rbegin());
    
    for (; riter != v.rend() ; ++riter)
        cout << *riter << " ";
    cout << endl;


    return 0;
}


결과 :

10 20 30 40 50

50 40 30 20 10



* begin(), rbegin(), end(), rend()

(v.end()는 v.rbegin()과 같고 v.begin 은 v.rend()와 같다.)


iterator의 시작 지점으로 초기화하고 끝지점을 찾기위해 vector의 begin()과 end()를 사용했다.

반대로 reverse_iterator 의 경우 시작 지점을 vector의 end()에서 부터 begin()을 끝지점으로 지정해도 결과는 같다.

하지만 해당 지점을 가리키고 있는 값을 출력하면 다른 결과가 나온다.


그 이유는 vector의 end() 지점이 vector의 마지막 요소가 아닌 그 다음 요소 즉 끝을 가리키는 지점을 가리키기 때문이다.

reverse_iterator 에서 end() 지점을 가리키면 끝을 가리키는 지점에서 reverse_iterator는 의도적으로 ++ 하여 마지막 요소를 가리키게 한다.

따라서 iterator 와 reverse_iterator 에 vector.end() 를 지정하면, 서로 다른 값을 가리키는 것이다.


아래 예제를 보면 이해할 수 있다.


#include <iostream>
#include <vector>
using namespace std;

int main(){

    vector<int> v;

    v.push_back(10);
    v.push_back(20);
    v.push_back(30);
    v.push_back(40);
    v.push_back(50);

    // 40 원소를 가리키는 정방향 반복자
    vector<int>::iterator iter = v.begin() + 3;

    // iter 의 위치를 초기화 지점으로한 역방향 반복자
    vector<int>::reverse_iterator reverse_iter(iter);

    cout << "정방향 반복자의 값 : " << *iter << endl;
    cout << "역방향 반복자의 값 : " << *reverse_iter << endl;
    cout << endl;


    for (vector<int>::iterator iter = v.begin(); iter != v.end(); iter++)
        cout << *iter << " ";
    cout << endl;

    
    for (vector<int>::reverse_iterator riter(v.rbegin()); riter != v.rend(); ++riter)
        cout << *riter << " ";
    cout << endl;


    return 0;
}


결과 :

정방향 반복자의 값 : 40

역방향 반복자의 값 : 30


10 20 30 40 50

50 40 30 20 10



출처: https://hyeonstorage.tistory.com/322?category=614599 [개발이 하고 싶어요]

'기타 > C++ STL' 카테고리의 다른 글

[STL] list 정리 및 예제  (0) 2019.07.30
[STL] deque 정리 및 예제  (0) 2019.07.30
[STL] vector 벡터 정리 및 예제  (0) 2019.07.30
[STL] not2 함수  (0) 2019.07.30
[STL] 스택(stack) 기본 예제  (0) 2019.07.30
[STL] sort() 정렬 예제  (0) 2019.07.30
[STL] find() 함수 예제  (0) 2019.07.30
[STL] 반복자 iterator 개념 및 예제  (0) 2019.07.30