[effective STL] 항목 28 : reverse_iterator 쓸 때 base() 잘 쓰기
2016. 2. 19. 07:52ㆍ프로그래밍/Effective STL
728x90
728x90
핵심
insert나 erase 사용 시 인자로 결국 iterator를 사용하기 때문에
reverse_iterator를 iterator로 변환해주어야한다.
이때 insert는 상관 없지만 erase는 대응하는 iterator가 아닐 수 있다.
1 2 3 4 5 6 7 8 9 | vector<int> intVec; const int VECSIZE = 10; intVec.reserve(VECSIZE); for (size_t i = 0; i < 5; i++) { intVec.push_back(i); } vector<int>::reverse_iterator ri = find(intVec.rbegin(), intVec.rend(), 3); | cs |
이런 백터가 있다고 치면 아래 그림과 같은 느낌이 된다고 한다.
Insert
1 2 3 4 5 | if (intVec.size() <= VECSIZE) { intVec.insert(ri.base(), 99); } // 0,1,2,3,99,4 printVec(intVec); | cs |
insert의 경우 원하는 결과로 3 뒤에 99가 푸쉬 됨을 확인했다.
Erase
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | // intVec.erase(ri.base()); // 0,1,2,3,4 -> delete 99!! // printVec(intVec); // not always compling. // intVec.erase(--ri.base()); // printVec(intVec); // always. intVec.erase((++ri).base()); printVec(intVec); | cs |
erase의 경우는 ri.base()를 호출 시 3이 삭제 되는 것이 아니라 99가 삭제된다.
--ri.base() 문장은 모든 STL 플랫폼에서 컴파일 되는 것은 아니라고 한다.
base() 함수가 const_iterator를 뱉어내서 그렇다고 한다.
(++ri).base()는 모든 플랫폼에서 컴파일 된다고 한다.
base()시에 정말 원하는 iterator를 가리키는지 다시 한번 확인하란 말!
728x90
반응형
'프로그래밍 > Effective STL' 카테고리의 다른 글
[effective STL] 항목 32 : 요소 정말로 제거하기 (2) | 2016.02.28 |
---|---|
[effective STL] 항목 31 : 정렬시 선택 사항들을 제대로 파악 (2) | 2016.02.27 |
[effective STL] 항목 30 : 알고리즘의 데이터 기록 범위는 충분히 크게 잡자. (0) | 2016.02.20 |
[effective STL] 항목 27 : const_iterator -> iterator는 distance와 advance를 사용하자. (2) | 2016.02.15 |
[effective STL] 항목 26 : 여러 iterator 중 쓸만한 것은 결국 iterator (2) | 2016.02.10 |
[effective STL] 항목 24 : map에서 []나 insert는 효율 문제에 주의하자. (0) | 2016.02.07 |
[effective STL] 항목 23 : 연관 컨테이너 대신 정렬된 벡터를 쓰는 것이 좋을 때도 있다. (2) | 2016.02.07 |