const_iterator를 iterator로 바꾸는 데에는 distance와 advance를 사용하자.

EffectiveSTL26 에서 설명한 것 처럼 iterator만 받아들이는 함수가 있어서 const_iterator를 iterator로 변환해야 하는 경우가 생길수 있는데 일반적으로 생각하는 캐스팅 연산으로는 변경을 할수가 없다. iterator 와 const_iterator 는 서로 상속 관계등이 존재하는것이 아닌 전혀 다른 클래스이기 때문이다. (vector 나 string은 iterator가 포인터이기 때문에 가능할수도 있다.)

const_iterator 에서 iterator의 변환은 아래의 코드와 같은식으로 진행된다.
typedef deque<int> IntDeque;
typedef IntDeque::iterator Iter;
typedef IntDeque::const_iterator ConstIter;

IntDeque d;

ConstIter ci;
// 생략
Iter i(d.begin());
advance(i, distance<ConstIter>(i,ci));

distance는 같은 컨테이너의 두 반복자 사이의 거리를 알려주며 advance는 첫번째 인자인 반복자를 두번째 인자의 지정된 거리만큼 전진 시킨다.
distance<ConstIter>(i,ci) 에 의해서 i가 자동은 const_iterator 로 변환되후(iterator는 const_iterator로 변환가능 EffectiveSTL26 참조) ci와의 거리를 구한다. advance는 그 거리만큼 i를 이동시켜 결과적으로 ci와 같은 위치를 가르키는 iterator를 얻게 된다.

이 변환 방법은 다 반복자 사이의 거리를 알아내는 것, 그리고 전진시키는 과정에서 각 반복자의 특성을 그래로 반영받는다. 즉 vector등은 상수시간에 처리가 될수 있지만 list등의 노드기만 컨테이너들은 선형시간이 걸릴수 있다.

“const_iterator를 iterator로 바꾸는 데에는 distance와 advance를 사용하자.”에 대한 2개의 댓글

    1. 와우 감사합니다.
      정리가 저보다 훨씬 잘되있으시네요.
      트랙백은 예전에 스팸트랙백이 너무 많이 와서 걍 안되게 해보렸습니다. ;;;

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다