본문 바로가기

[ C/ C++ 프로그래밍 ]/[ STL ]

[ 혼연 정리 ] 반복자- 1 [ 반복자 정의 ]


ㅇ 반복자 정의

 컨테이너의 한 지점을 가리키는 객체

 


알고리즘이란 컨테이너 자체에 대해 적용하는 것이 아니라 결국은 컨테이너의 요소들에 적용되는 것이므로 요소를 읽고 쓸 수 있어야 하는데  이를 위해
반복자가 사용된다.  알고리즘은 반복자를 통해 컨테이너의 요소를 읽고 변경하며 컨테이너는 알고리즘을 호출할 때 작업 대상 요소를 반복자로 지정한다.
그래서 반복자를 알고리즘과 컨테이너를 연결하는 매개체라고 한다. 반복자를 통해서만 컨테이너의 요소에 접근한다.

반복자를 관리하는 기본적인 방법은 ++, --, *, ==. > , <등의 연산자이며 이 연산자들은 모두 반복자에 대해 동일한 의미를 가진다.
요소들이 어떤 모양을 가지든지 * 연산자로 읽을 수 있고 요소들간의 배치 관게에 상관없이 ++만 하면 다음 요소로 이동이 가능하다.

 

STL 알고리즘의 원형을 보면 컨테이너에 대한 정보는 전혀 전달되지 않으면 반복자에 대한 정보만 전달된다.
반복자는 임의의 컨테이너와 임의의 알고리즘을 연결하여 STL의 일반성을 확보하는 가장 중요한 장치이다.
영어 원문으로는 이터레이터(iterator)이라고 한다.


ㅇ 반복자 구간
모든 알고리즘 함수들은 작업 대상을 전달받기 위해 반복자를 인수로 받아 들인다.
알고리즘은 보통은 두개의 반복자로 표현되는 반복자 구간을 받아 들여 구간내의 모든 요소에 대해 적용한다.

InIt find(InIt first, InIt last, const T& val);
void sort(RanIt first, RanIt last);

구간의 시작점을 first, 끝을 last라고 쓴다.

 



first는 구간에 포함되지만 last는 포함되지 않는다.

1 InIt find(InIt first, InIt last, const T& val)
2 {
3      for ( ; first != last ; ++first ) {
4          if (*first == val) break;
5      }
6      return first;
7 }
8


조건식을 first < last로 대소 비교하지 않고 frist != last로 하고 있다.

이렇게 하는 이유는 리스트의 반복자의 경우  메모리에 여기 저기에 흩어져 있는 노드의 포인터인데 앞쪽 노드가 반드시 앞쪽 번지에 있다고 보장할 수 없다.
그래서 부등 비교를 할 수 밖에 없으며 또한 반복자는 절대 두 칸이 상 이동하지 않으므로 부등 비교를 해도 안전하다.

last와 first가 같은면 구간의 길이는 0이다. 0이면 아무것도 하지 않고 반복자를 리턴한다.

반복자에 대해 마지막으로 주의해야 할점은 STL 알고리즘은 반복자의 유효성을 전혀 점검하지 않으며 항상 유효하다고 가정한다는 것이다.
반복자가 틀릴 위치를 가리키고 있을 경우 결과는 정의되어 있지 않는데 재수 없으면 다운 될 수도 있다.

 


 ps : 자세한 내용은  www.WinAPI.co.kr 참고