[effective STL] 항목 26 : 여러 iterator 중 쓸만한 것은 결국 iterator

2016. 2. 10. 22:50프로그래밍/Effective STL

728x90
728x90

총 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를 사용하자는 이야기.

728x90
반응형