reverse_iterator (역방향 반복자)
역방향 반복자도 ++와 -- 로 반복하지만 정방향 반복자의 반대로 동작합니다.
역방향 반복자가 ++ 되면 끝지점 인덱스가 5일경우 4로 이동하고, 4에서 -- 로 이동하면 5로 이동합니다.
#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 << endl;
}
cout << endl;
//일반 반복자 iterator를 역방향 반복자 reverse_iterator로 변환
reverse_iterator<vector<int>::iterator> riter(v.end()); //v의 끝지점의 반대편 = v의 시작지점
reverse_iterator<vector<int>::iterator> end_riter(v.begin()); //v의 시작지점의 반대편 = v의 끝지점
for (; riter != end_riter; ++riter) {
cout << *riter << endl;
}
return 0;
}
출력
10 20 30 40 50
50 40 30 20 10
정방향 반복자와 역방향 반복자 구조

- begin( ): 첫번째 원소를 가리키고 있음
- end( ) : 마지막 원소의 다음을 가리키고 있음
- rbegin( ): 마지막 원소의 다음를 참조, 값에 접근시 마지막 원소를 가리킴
- 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);
v.push_back(60);
vector<int>::iterator normal_iter = v.begin() + 3; //v에서 3번이동
vector<int>::reverse_iterator reverse_iter(normal_iter); // = normal_iter는 타입이 안맞아서 에러걸림!
cout << "정방향 반복자의 값: " << *normal_iter << endl;
cout << "역방향 반복자의 값: " << *reverse_iter << endl;
for (vector<int>::iterator iter = v.begin(); iter != normal_iter; ++iter) {
cout << *iter << " ";
}
cout << endl;
for (vector<int>::reverse_iterator riter = reverse_iter; riter != v.rend(); ++riter) {
cout << *riter << " ";
}
cout << endl;
return 0;
}
결과

10 | 20 | 30 | 40 | 50 | 60 |
- normal_iter : 벡터v의 시작지점에서 3번 이동한 40을 가리킴.
- reverse_iter: v에서 3번 이동한 normal_iter의 참조로 초기화 (역방향 반복자가 가리키는 값은 참조위치에 다음 값이므로 30이 됨.)
출력은 for문 조건문에 의해
정방향은 10 20 30 후 40으로 값이 같아지므로 출력되지 않고 종료.
역방향은 30부터 출력하여 10까지 출력후 종료되므로 30 20 10이 출력.
라이브러리가 제공하는 이항 조건자 Less에 함수어댑터 Not2를 적용시킨 코드
#include <iostream>
#include <functional>
using namespace std;
int main() {
cout << less<int>()(10, 20) << endl;
cout << less<int>()(20, 20) << endl;
cout << less<int>()(20, 10) << endl;
cout << "============" << endl;
//결과를 돌리느냐 연산을 돌리느냐 차이
cout << not2(less<int>())(10, 20) << endl; //10 < 20 의 결과를 반대로 돌려 연산
cout << not2(less<int>())(20, 10) << endl;
cout << not2(less<int>())(20, 10) << endl;
cout << endl;
less<int> l;
cout << l(10, 20) << endl;
cout << l(20, 20) << endl;
cout << l(20, 10) << endl;
cout << "=============" << endl;
cout << not2(l)(10, 20) << endl; //less 연산은 x < y 로 계산되므로 이에 반대인 >= 로 연산시키고 10 >= 20 으로 연산
cout << not2(l)(20, 20) << endl;
cout << not2(l)(20, 10) << endl;
return 0;
}

이항 조건자: 매개변수를 2개 받는 조건자
기본적으로 less는 int형 매개변수 x 와 y를 받는다 하면 less<int>(x,y) 로 선언하여 x < y 의 연산을 실행합니다.
코드 분석
- not2(less<int>())(10,20)은 10 < 20 의 결과인 1을 부정하므로 결과는 0
- less<int>인 L 을 not(L)(10,20) 하면 Less의 연산인 < 의 반대인 >= 로 연산하여 10 >= 20 연산을 수행함 결과는 0
두 코드의 차이는 결과를 부정하느냐 연산을 부정하느냐 차이.
'C++ > STL' 카테고리의 다른 글
[STL] 5장 문제풀이 (0) | 2025.03.08 |
---|---|
[STL] 할당기 (0) | 2025.03.03 |
[STL] 함수객체 (0) | 2025.03.03 |
[STL] 어댑터 (0) | 2025.03.03 |
[STL] 알고리즘 Algorithm (0) | 2025.03.03 |