2016. 2. 10. 22:50ㆍ프로그래밍/Effective STL
총 4개의 iterator를 제공한다.
iterator, const_iterator, reverse_iterator, const_reverse_iterator
일종의 T*, const T*, 그리고 head 부터인지 tail 부터인지 차이다.
iterator의 변환 관계는 다음과 같다.
iterator가 좋은 이유
- 어떤 형태의 insert나 erase 멤버 함수는 무조건 iterator만을 넘겨야 한다.
- const_iterator를 iterator로 암묵적 변환할 방법이 없다. 방법이 있지만 성능과 안정성이 보장되지 않는다.
- reverse_iterator를 iterator로 변환할 수 있지만 변환 후 약간의 조정이 필요하다.
const_iterator와 iterator를 동시에 사용할 시 팁
Tip 1
1
2
3
4
5
6
7
8
9
10
11
12
|
typedef ... Iter
typedef ... ConstIter
...
Iter it;
ConstIter constIt;
...
if (it == constIt) { ... }
|
cs |
다음과 같은 코드가 있을 때 잘 설계된 STL이라면 it를 const_iterator로 형변환하여 이를 비교한다고 한다.
컴파일이 되지 않는다면 ?
이유는 const_iterator에 operator==를 멤버 함수로 선언해 두었기 때문이다.
(비멤버 함수로 선언하여 두 개의 매개 변수를 받게 하면 해결된다.)
해결방법
1
|
if (constIt == it) { ... }
|
cs |
Tip 2
1
|
if (it - constIt >= 3) { ... }
|
cs |
여기서 it 와 constIt를 바꾸는 것을 생각했다면 자신이 바보스럽게 느껴질 수 있다고 한다... (ㅋㅋㅋㅋㅋ)
해결 방법
1
|
if (constIt + 3 <= i) { ... }
|
cs |
결론
빛나는 iterator를 생각하면 const_iterator가 iterator보다 쓸모가 없을 뿐만 아니라 가끔 골치아픈 문제를 일으킨다.
결국 const_iterator보단 iterator를 사용하자는 이야기.
'프로그래밍 > Effective STL' 카테고리의 다른 글
[effective STL] 항목 30 : 알고리즘의 데이터 기록 범위는 충분히 크게 잡자. (0) | 2016.02.20 |
---|---|
[effective STL] 항목 28 : reverse_iterator 쓸 때 base() 잘 쓰기 (0) | 2016.02.19 |
[effective STL] 항목 27 : const_iterator -> iterator는 distance와 advance를 사용하자. (2) | 2016.02.15 |
[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 |
[effective STL] 항목 21 : 연관 컨테이너용 비교 함수는 ==에 대해선 false를 반환해야 한다. (0) | 2016.01.03 |