내가 STL에 조예가 깊어서 글을 남기는 것이
아니라, Effecitve STL 을 공부하는 사람들이 이 글을 보고, 도움이 되었으면 하는 생각과, 혹시 내가 틀린것이 있다면
지적해 주시지 않을까 란 생각으로 글을 올리는것임을 미리 밝힙니다. - 최익필
우리말이 자주 어렵다고 생각한다. 글을 쓸 때, 문맥상 이상하게 이어지는 경우가 많기 때문이다. 그래서 "A는 B이다" 식으로 이야기를 하려고 한다.
이번 주제는 reverse_iterator.base() 가 어떻게 동작하는지에 대한 이야기이다. 왜냐하면 insert() 나 erase()로 reverse_iterator 를 사용할 수 없어, iterator 로 변환하는데 base() 함수를 사용 하기 때문이다.
base()로 가리킨 iterator 는 무엇을 가리키고 있는가?
실험을 통해 vector에 5개의 데이터 1,2,3,4,5 를 넣어보고, reverse_iterator 가 무엇을 가리키고 iterator 변환시 무엇을 가리키는지 알아 보겠다.
자.. 규칙을 찾앗다. base()로 변환된 iterator는 순향반복자 기준으로 다음것을 가리킨다. 만약 insert 나 erase 하게 될 경우, 이 부분을 알고서 사용 해야 할 것이다.
... 어떻게 사용 하냐고? .. 음.. 아래 코드를 보면 된다.
책에선 안된다는 --rit.base() 해 보았지만, MSVC2005 에선 잘된다. 그래도 컴파일 특성이 다를 수 있으니 (++rit).base() 로 사용하게 좋을 듯 싶다.^^(내부 iterator 가 const_iterator 가 아닌 iterator로 반환하는것을 확인)
개인적인 생각
base() 호출시 바로 it에 대응하는 것을 벹어 낼수도 있는데 왜 항상 다음것을 벹어 내는가? 그 이유는 reverse_iterator의 rend() 과 iterator의 begin() 을 매칭 시키기 위해서다. 이렇게 하는 것은 end() 도 자연스럽게 맞쳐지며, 구현자나 사용자나 보다 쉽게 이용할수 있기 때문이라고 개인적으로 생각 한다.(뭐.. base()가 대응되는게 한칸 뒤라는것을 기억해야 하겠지만.^^)
이것만은 잊지 말자
1. base() 가 뱉어내는 iterator는 reverse_iterator 의 전 원소이다.(이해가 어렵다면,, 위의 코드를 보는게 더 도움이 될듯)
관련링크
http://alones.kr/blog/841 <-- 이것도 같은 설명~
http://ilu8318.egloos.com/797949 <-- 이것도 같은 설명
우리말이 자주 어렵다고 생각한다. 글을 쓸 때, 문맥상 이상하게 이어지는 경우가 많기 때문이다. 그래서 "A는 B이다" 식으로 이야기를 하려고 한다.
이번 주제는 reverse_iterator.base() 가 어떻게 동작하는지에 대한 이야기이다. 왜냐하면 insert() 나 erase()로 reverse_iterator 를 사용할 수 없어, iterator 로 변환하는데 base() 함수를 사용 하기 때문이다.
base()로 가리킨 iterator 는 무엇을 가리키고 있는가?
실험을 통해 vector에 5개의 데이터 1,2,3,4,5 를 넣어보고, reverse_iterator 가 무엇을 가리키고 iterator 변환시 무엇을 가리키는지 알아 보겠다.
자.. 규칙을 찾앗다. base()로 변환된 iterator는 순향반복자 기준으로 다음것을 가리킨다. 만약 insert 나 erase 하게 될 경우, 이 부분을 알고서 사용 해야 할 것이다.
... 어떻게 사용 하냐고? .. 음.. 아래 코드를 보면 된다.
책에선 안된다는 --rit.base() 해 보았지만, MSVC2005 에선 잘된다. 그래도 컴파일 특성이 다를 수 있으니 (++rit).base() 로 사용하게 좋을 듯 싶다.^^(내부 iterator 가 const_iterator 가 아닌 iterator로 반환하는것을 확인)
그림으로 표현된 reverse_iterator 와 iterator의 차이
개인적인 생각
base() 호출시 바로 it에 대응하는 것을 벹어 낼수도 있는데 왜 항상 다음것을 벹어 내는가? 그 이유는 reverse_iterator의 rend() 과 iterator의 begin() 을 매칭 시키기 위해서다. 이렇게 하는 것은 end() 도 자연스럽게 맞쳐지며, 구현자나 사용자나 보다 쉽게 이용할수 있기 때문이라고 개인적으로 생각 한다.(뭐.. base()가 대응되는게 한칸 뒤라는것을 기억해야 하겠지만.^^)
이것만은 잊지 말자
1. base() 가 뱉어내는 iterator는 reverse_iterator 의 전 원소이다.(이해가 어렵다면,, 위의 코드를 보는게 더 도움이 될듯)
관련링크
http://alones.kr/blog/841 <-- 이것도 같은 설명~
http://ilu8318.egloos.com/797949 <-- 이것도 같은 설명
'책 정리 > Effective STL' 카테고리의 다른 글
항목 33 : remove와 비슷한 알고리즘을 포인터의 컨테이너에 적용할 때에는 각별히 조심하자. (0) | 2008.09.02 |
---|---|
항목 32 : 요소를 정말로 제거하고자 한다면 remove 류의 알고리즘에는 꼭 erase를 붙여 사용하자. (0) | 2008.09.02 |
항목 31 : 정렬시의 선택 사항들을 제대로 파악해 놓자. (0) | 2008.09.02 |
항목 30 : 알고리즘의 데이터 기록 범위(destination range)는 충분히 크게 잡자 (0) | 2008.07.28 |
항목 29 : 문자 단위의 입력에는 istreambuf_iterator의 사용도 적절하다. (0) | 2008.07.27 |
항목 27 : const_iterator를 iterator로 바꾸는 데에는 distance와 advance를 사용하자. (0) | 2008.07.27 |
항목 26: const_iterator나 reverse_iterator, const_reverse_iterator도 좋지만 역시 쓸만한 것은 iterator이다 (0) | 2008.07.26 |
항목 25: 현재는 표준이 아니지만, 해쉬 컨테이너에 대해 충분히 대비해 두자 (0) | 2008.07.26 |
항목 24: map::operator[]나 map::insert는 효율 문제에 주의하여 선택하자 (5) | 2008.07.26 |
항목 23 : 연관 컨테이너 대신에 정렬된 vector를 쓰는 것이 좋을 때가 있다. (0) | 2008.07.22 |
최근댓글