[C++STL] 반복자 - X::reverse_iterator & X::reverse_const_iterator

박남호·2022년 12월 14일
0

컨테이너의 rbegin() 멤버 함수는 컨테이너 순차열의 끝 표시 반복자이다. rend() 멤버 함수는 순차열의 첫 원소를 가리키는 반복자를 반환한다. 아래는 vector 컨테이너의 정방향 반복자와 역방향 반복자를 비교한 예제이다.

#include <iostream>
#include <vector>

using namespace std;

int main(void)
{
	vector<int> v;
	v.push_back(10);
	v.push_back(20);
	v.push_back(30);
	v.push_back(40);
	v.push_back(50);

	vector<int>::iterator begIter = v.begin();
	vector<int>::iterator endIter = v.end();
	cout << "iter : ";
	for (vector<int>::iterator iter = v.begin(); iter != v.end(); ++iter)
	{
		cout << *iter << ", ";
	}
	cout << endl;
	cout << "riter : ";
	for (vector<int>::reverse_iterator riter = v.rbegin(); riter != v.rend(); ++riter)
	{
		cout << *riter << ", ";;
	}
	cout << endl;

	return 0;
}

iter는 ++하면 반복자가 순차열의 정방향으로 이동하지만 riter를 ++하면 반복자가 순차열 역방향으로 이동한다.

X::reverse_iterator와 X::reverse_const_iterator 형식은 반복자 어댑터 reverse_iterator< T >를 사용해 X::iterator와 X::const_iterator를 반대로 동작하도록 변환한 형식입니다.

#include <iostream>
#include <vector>

using namespace std;

int main(void)
{
    vector<int> v;
    v.push_back(10);
    v.push_back(20);
    v.push_back(30);
    v.push_back(40);
    v.push_back(50);

    reverse_iterator<vector<int>::iterator> rBegIter(v.end());
    reverse_iterator<vector<int>::iterator> rEndIter(v.begin());
    cout << "v [rBegIter, rEndIter): ";
    while (rEndIter != rBegIter)
    {
        cout << *rBegIter << ' ';
        ++rBegIter;
    }
    cout << endl;

    vector<int>::const_reverse_iterator rConstBegIter = v.rbegin();
    vector<int>::const_reverse_iterator rConstEndIter = v.rend();
    cout << "v with const reverse iterator: ";
    while (rConstEndIter != rConstBegIter)
    {
        cout << *rConstBegIter << ' ';
        ++rConstBegIter;
    }
    cout << endl;

    return 0;
}

굳이 왜 이렇게해서 쓰는지는... 잘모르겠다...

profile
NamoPark

0개의 댓글