[STL] 어댑터2

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

 


 

정방향 반복자와 역방향 반복자 구조

etc-image-0
출처: https://velog.velcdn.com/images/kkksy09/post/f6496cd9-cba1-4357-8218-ec9621714ade/image.jpg

 

- 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;
}

 

결과

etc-image-1

 

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;
}

 

etc-image-2

 

 

이항 조건자: 매개변수를 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