내가 STL에 조예가 깊어서 글을 남기는 것이
아니라, Effecitve STL 을 공부하는 사람들이 이 글을 보고, 도움이 되었으면 하는 생각과, 혹시 내가 틀린것이 있다면
지적해 주시지 않을까 란 생각으로 글을 올리는것임을 미리 밝힙니다. - 최익필
저번 26항목에서 각 iterator 간의 변환 과정을 그림(?) 으로 보여 주었었다.
const_iterator
↗ ↖
iterator ↖ base()
↘↖base() ↖
reverse_iterator → const_reverse_iterator
다시 정리 하자면,
1. 화살표 방향은 컴파일러에 의해서 암시적으로 바뀐다.(안그런 컴파일러도 있으니 해결방법은 26항목)
2. base() 는 함수이고, 명시적으로 사용자가 호출해야지만, 변환이 가능하다는 것이다.
여기서 잠깐,
혹시 iterator 를 casting 하면 되지 않을까? 란 생각을 했다면, 아직 iterator 가 어떻게 구현되었는지 분석하지 않은듯 보이는데, iterator는 .. class객체이며, 각 iterator 마다 각기 다른 class 이다. 그렇기 때문에 cating 을 해도 정상 작동하지 않는다.
본론으로 들어와서.. const_iterator ---> iterator 방향으로 변환이 되지 않는데, 어떻게 저자는 바꿀수 있다고 할수 있는가?
그 꽁수가 distance 함수와 advance 함수를 사용하는것이다. 아래 코드도 포함한다.
즉 두 같은 타입의 두 iterator를 받아 드리어, 그 사이를 리턴해 준다.
std::advace()의 인자값으러 넣은 iterator를 Off 길이 만큼 이동 시켜 준다.
자.. 두 함수의 설명은 끝났고. 이제 이 두 함수를 이용하여, const_iterator 를 iterator 로 변환해 보자. 주의해야 할것은 std::distance 는 한가지 타입의 iterator만 받는 템플릿 함수이므로 그냥 호출하면 const_iterator 를 iterator 로 변환을 시도하여, 컴파일타임 에러를 발생시킬 것이다.
그래서 명시적으로 const_iterator 라고 알려 주기만 하면 된다. 그래서 아래의 코드처럼 하면 iterator 로 변환 완료!
그런데 눈치 빠른 분들은 이런 생각을 하게 될 것이다. "이거 쓸때 없는 비용 많이 무는거 같은데..? 거리가 멀면 멀어질수록 더 느려지잖아?" .. 맞다. 역시 당신은 똑똑했다. 그래서 const_iterator 보다 iterator 를 사용하라고 26장에서 설명했던 것이다.
이것 만은 잊지 말자.
1. const_iterator 를 iterator 로 바꿀수 있다!
2. 대신 좀 시간이 걸린다. 속편히 iterator 를 사용하는것을 염두하자.
관련링크
http://lagoons.net/tt/594 <-- 깔끔한 설명
http://alones.kr/blog/626?TSSESSIONaloneskrblog=1e73a3a9327170d3301688495e6aeb41 <-- 다른 경우
저번 26항목에서 각 iterator 간의 변환 과정을 그림(?) 으로 보여 주었었다.
const_iterator
↗ ↖
iterator ↖ base()
↘↖base() ↖
reverse_iterator → const_reverse_iterator
다시 정리 하자면,
1. 화살표 방향은 컴파일러에 의해서 암시적으로 바뀐다.(안그런 컴파일러도 있으니 해결방법은 26항목)
2. base() 는 함수이고, 명시적으로 사용자가 호출해야지만, 변환이 가능하다는 것이다.
여기서 잠깐,
혹시 iterator 를 casting 하면 되지 않을까? 란 생각을 했다면, 아직 iterator 가 어떻게 구현되었는지 분석하지 않은듯 보이는데, iterator는 .. class객체이며, 각 iterator 마다 각기 다른 class 이다. 그렇기 때문에 cating 을 해도 정상 작동하지 않는다.
본론으로 들어와서.. const_iterator ---> iterator 방향으로 변환이 되지 않는데, 어떻게 저자는 바꿀수 있다고 할수 있는가?
그 꽁수가 distance 함수와 advance 함수를 사용하는것이다. 아래 코드도 포함한다.
즉 두 같은 타입의 두 iterator를 받아 드리어, 그 사이를 리턴해 준다.
std::advace()의 인자값으러 넣은 iterator를 Off 길이 만큼 이동 시켜 준다.
자.. 두 함수의 설명은 끝났고. 이제 이 두 함수를 이용하여, const_iterator 를 iterator 로 변환해 보자. 주의해야 할것은 std::distance 는 한가지 타입의 iterator만 받는 템플릿 함수이므로 그냥 호출하면 const_iterator 를 iterator 로 변환을 시도하여, 컴파일타임 에러를 발생시킬 것이다.
그래서 명시적으로 const_iterator 라고 알려 주기만 하면 된다. 그래서 아래의 코드처럼 하면 iterator 로 변환 완료!
그런데 눈치 빠른 분들은 이런 생각을 하게 될 것이다. "이거 쓸때 없는 비용 많이 무는거 같은데..? 거리가 멀면 멀어질수록 더 느려지잖아?" .. 맞다. 역시 당신은 똑똑했다. 그래서 const_iterator 보다 iterator 를 사용하라고 26장에서 설명했던 것이다.
이것 만은 잊지 말자.
1. const_iterator 를 iterator 로 바꿀수 있다!
2. 대신 좀 시간이 걸린다. 속편히 iterator 를 사용하는것을 염두하자.
관련링크
http://lagoons.net/tt/594 <-- 깔끔한 설명
http://alones.kr/blog/626?TSSESSIONaloneskrblog=1e73a3a9327170d3301688495e6aeb41 <-- 다른 경우
'책 정리 > Effective STL' 카테고리의 다른 글
항목 32 : 요소를 정말로 제거하고자 한다면 remove 류의 알고리즘에는 꼭 erase를 붙여 사용하자. (0) | 2008.09.02 |
---|---|
항목 31 : 정렬시의 선택 사항들을 제대로 파악해 놓자. (0) | 2008.09.02 |
항목 30 : 알고리즘의 데이터 기록 범위(destination range)는 충분히 크게 잡자 (0) | 2008.07.28 |
항목 29 : 문자 단위의 입력에는 istreambuf_iterator의 사용도 적절하다. (0) | 2008.07.27 |
항목 28 : reverse_iterator에 대응되는 기점 반복자(base iterator)를 사용하는 방법을 정확하게 이해하자. (1) | 2008.07.27 |
항목 26: const_iterator나 reverse_iterator, const_reverse_iterator도 좋지만 역시 쓸만한 것은 iterator이다 (0) | 2008.07.26 |
항목 25: 현재는 표준이 아니지만, 해쉬 컨테이너에 대해 충분히 대비해 두자 (0) | 2008.07.26 |
항목 24: map::operator[]나 map::insert는 효율 문제에 주의하여 선택하자 (5) | 2008.07.26 |
항목 23 : 연관 컨테이너 대신에 정렬된 vector를 쓰는 것이 좋을 때가 있다. (0) | 2008.07.22 |
항목 22 : set과 multiset에 저장된 데이터 요소에 대해 키(key)를 바꾸는 일은 피하자. (1) | 2008.07.19 |
최근댓글