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 |