[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
반응형