[effective STL] 항목 27 : const_iterator -> iterator는 distance와 advance를 사용하자.
2016. 2. 15. 23:31ㆍ프로그래밍/Effective STL
728x90
728x90
핵심(우리가 해서는 안 될 짓)
const_iterator와 iterator는 서로 다른 클래스이다.
string과 complex<double>의 관게보다도 멀다고 한다.
한 마디로 캐스팅이 안 된다. 전혀 엉뚱한 클래스를 캐스팅하려 하지 말자.
해결(const_it -> it)
과정
1. 컨테이너의 첫 요소를 가리키는 iterator를 생성한다.
2. const_iterator가 가리키는 곳 까지 iterator가 뛰면 끝! so simple!
3. 거리 계산엔 distance와 점프엔 advance가 사용된다.
그럼 이렇게 하면 되는가?
1 | advance(i, distance(it, constIt)); | cs |
안 된다고 하신다.
distance의 선언문을 보자
1 2 | template<typename InputIterator> typename ierator_traits<InputIterator>::difference_type distance(InputInterator first, InputIterator last); | cs |
반환 타입이 무려 56자가 되는 요상한 형태지만 주의 할 것은 매개 변수인 InputIterator
두 변수는 같은 모양으로 선언되어 있으므로 인자가 들어갈 때 서로 다른 타입이 될 수 없다.
distance에 들어갈 타입 매개 변수를 직접 지정하면 된다.
1 | advance(i, distance<ConstIter>(it, constIt)); | cs |
iterator는 컴파일러에 의해 const_iterator로 저절로 바뀌기 때문에 말끔하게 이뤄진다.
효율문제
반복자의 특성만큼 효율이 조금씩 다르다.
임의 접근 반복자 : 상수 시간. vector, string, deque
표준 컨테이너 : 선형 시간. 서..선형이라니!
728x90
반응형
'프로그래밍 > Effective STL' 카테고리의 다른 글
[effective STL] 항목 31 : 정렬시 선택 사항들을 제대로 파악 (2) | 2016.02.27 |
---|---|
[effective STL] 항목 30 : 알고리즘의 데이터 기록 범위는 충분히 크게 잡자. (0) | 2016.02.20 |
[effective STL] 항목 28 : reverse_iterator 쓸 때 base() 잘 쓰기 (0) | 2016.02.19 |
[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 |
[effective STL] 항목 22 : set과 multiset의 키를 바꾸지 말자. (1) | 2016.02.07 |