플랫폼/C++

Reverse_iterator 에 대해서

방랑여행 2013. 5. 31. 15:42

1. reverse_iterator를 만드는 방법 (constructor)

(http://www.cplusplus.com/reference/iterator/reverse_iterator/reverse_iterator/)

 

 

다음과 같이 사용한다.

 

ex1) vector<int>::reverse_iterator riter1(iterator iter)  // iterator를 사용해서 reverse_iterator 만들기

- 이 때 생성되는 reverse_iterator는,

  생성에 사용된 iterator가 가리키는 원소의 바로 이전 원소를 가리킨다.

   아래의 코드를 보면 쉽게 알 수 있다. (출처 : 위의 URL)

 

// reverse_iterator example
#include      // std::cout
#include      // std::reverse_iterator
#include        // std::vector

int main () {
  std::vector myvector;
  for (int i=0; i<10; i++) myvector.push_back(i);

  typedef std::vector::iterator iter_type;
                                                         // ? 0 1 2 3 4 5 6 7 8 9 ?
  iter_type from (myvector.begin());                     //   ^
                                                         //         ------>
  iter_type until (myvector.end());                      //                       ^
                                                         //
  std::reverse_iterator rev_until (from);     // ^
                                                         //         <------
  std::reverse_iterator rev_from (until);     //                     ^

  std::cout << "myvector:";
  while (rev_from != rev_until)
    std::cout << ' ' << *rev_from++;
  std::cout << '\n';

  return 0;
}

 

 

 

ex2) vector<int>::reverse_iterator riter2(reverse_iterator rev_iter)  // 기존의 reverse_iterator를 복사해서 만들기

- 이건 간단하다.

 

 

 

2. reverse_iterator를 다시 iterator로 돌리는 방법(base)

http://www.cplusplus.com/reference/iterator/reverse_iterator/base/

 

 

그냥 iterator는, begin()이 첫 원소를 가리키고, end()가 끝 원소 바로 다음 자리를 가리킨다.

 reverse_iterator는, rbegin()이 끝 원소를 가리키고, rend()가 첫 원소 이전 자리를 가리킨다.

 

이와 같이, 두 위치는 iterator가 항상 reverse_iterator보다 1만큼 뒤쪽(오른쪽)에 위치한다고 할 수 있다.

이러한 관계에서 나온 것이 base() 이다.

 

0 1 2 3 4 5 로 이루어진 벡터가 있고, 현재 reverse_iterator인 riter 가 3을 가리키고 있다고 하자.

riter.base()는, 바로 다음 원소인 4를 가리키는 iterator를 반환한다. 즉 *(riter.base()) 의 값은 4이다.

 

 

 

3. reverse_iterator과 iterator의 변환 예

 

#include 
#include 
#include 
#include 	// find
using namespace std;

int main(void)
{
	// we want to delete from 3 to 5
	vector numbers;
	for(int i = 0; i < 10; i++)	numbers.push_back(i);
	

	// method 1 : using normal iterator
	vector::iterator iter_from, iter_to;		

	iter_from = find(numbers.begin(), numbers.end(), 3);
	iter_to = find(numbers.begin(), numbers.end(), 5);	
	iter_to++;	// iter_to should point the 'next' element of '5'.

	//numbers.erase(iter_from, iter_to);

	
	
	// method 2 : using reverse_iterator
	vector::reverse_iterator riter_from(iter_to), riter_to(iter_from);

	numbers.erase(riter_to.base(), riter_from.base());



	// Printing the result
	for(int i = 0; i < numbers.size(); i++)		cout << numbers[i] << " ";

	return 0;
}


 

 

 

'플랫폼 > C++' 카테고리의 다른 글

Stringstream 사용법 정리  (0) 2013.07.17
공백을 포함해 한 줄 입력받기  (0) 2013.07.09
lower_bound와 upper_bound  (0) 2013.05.30
pair의 크기 비교 방식  (0) 2013.05.29