공부/C || C++

C++ iterator를 reverse_iterator로 변환시 같은 element를 가리키지 않는 이유

sudo 2021. 7. 30. 00:35
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

 

Reverse Iterator points to the wrong point

I am trying to reverse iterate through a map of type : 0 3 7 10 15 I need to reverse iterate through this map starting from 10 back to the start: for(map::reverse_it...

stackoverflow.com