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