const_iterator에서 iterator로 암시적 변환이 불가능하므로 명시적 변환을 해야 함

캐스팅은 컴파일 에러 발생 (다른 컨테이너도 마찬가지)

const_iterator와 iterator는 서로 다른 클래스이므로 컴파일러가 const_cast를 거부

deque<int>::const_iterator constIter;

deque<int>::iterator iter(constIter); // 에러
deque<int>::iterator iter(const_cast<deque<int>::iterator>(constIter)); // 에러

 

advance와 distance 함수를 사용해 iterator를 const_iterator 위치까지 이동하는 방법

distance는 같은 컨테이너를 가리키고 있는 두 반복자 사이의 거리를 반환

advance는 어떤 반복자를 지정된 거리만큼 이동

deque<int> deque;
deque<int>::const_iterator constIter;
deque<int>::iterator iter = deque.begin();

advance(iter, distance<deque<int>::const_iterator>(iter, constIter));

 

distance의 템플릿 매개변수 타입을 명시적으로 지정하는 이유는 distance의 템플릿 매개변수 타입 _Init이 동시에 iterator, const_iterator 2개의 타입이 되는 것이 불가능하기 때문

따라서 명시적으로 매개변수 타입을 지정하여 컴파일러의 타입 추론을 방지

template <class _Iter>
using _Iter_diff_t = typename iterator_traits<_Iter>::difference_type;

template <class _InIt>
_NODISCARD _CONSTEXPR17 _Iter_diff_t<_InIt> distance(_InIt _First, _InIt _Last) {

 

위 방법은 임의 접근 반복자(vector, string, deque)는 상수 시간, 양방향 반복자(나머지 컨테이너)는 선형 시간에 동작이 완료됨

+ Recent posts

목차