[STL] 역방향 반복자 (reverse_iterator)
[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 |