int main()
{
std::vector<int> v;
v.reserve(5);
for (int i = 0; i < 5; ++i)
{
v.push_back(i);
}
std::vector<int>::iterator iter = find(v.begin(), v.end(), 3);
std::cout << "forward iter: " << *iter << std::endl;
std::vector<int>::reverse_iterator riter(iter);
std::cout << "reverse iter: " << *riter << std::endl;
return 0;
}
위 코드의 출력 결과는
서로 다른 element를 가리키는 이유는 reverse iterator와 forward iterator(우리가 아는 일반적인 iterator)는 서로 1대 1 mapping이 되어야 하기 때문이다. 알기 쉽게 그림으로 표현하면
0 | 1 | 2 | 3 | 4 | end |
rend | 0 | 1 | 2 | 3 | 4(=rbegin) |
이렇게 같은 column끼리 1대1 mapping이 되어야 하므로 forward iterator일때는 3을 가리키지만 reverse iterator일때는 2를 반환한다. 참고로 reverse iterator를 다시 forward iterator로 변환하기 위해서는 base() 함수를 다음과 같이 이용할 수 있고, forward iterator에서 reverse iterator로는 첫번째 코드 예시에서 볼 수 있듯이, 암묵적인 변환이 가능하다.
int main()
{
std::vector<int> v;
v.reserve(5);
for (int i = 0; i < 5; ++i)
{
v.push_back(i);
}
std::vector<int>::iterator iter = find(v.begin(), v.end(), 3);
std::cout << "forward iter: " << *iter << std::endl;
std::vector<int>::reverse_iterator riter(iter);
std::cout << "reverse iter: " << *riter << std::endl;
iter = riter.base();
std::cout << "back to forward iter: " << *iter << std::endl;
return 0;
}
Reference
https://stackoverflow.com/questions/19873078/reverse-iterator-points-to-the-wrong-point
'공부 > C || C++' 카테고리의 다른 글
C/C++ 함수 포인터를 반환하는 함수 (0) | 2021.08.06 |
---|---|
C 입력 버퍼 비우기 (0) | 2021.07.30 |
C++ 11 universal reference, std::forward (0) | 2021.07.25 |
C++ 11 함수 객체(Functor)와 람다 표현식(Lambda Expression) (0) | 2021.07.24 |
C++ 템플릿 특수화 (0) | 2021.07.24 |