본문 바로가기

예전/STL

[STL] 반복자와 반복자 무효화 현상


반복자


반복자란 컨테이너에 저장된 요소를 순회하고 접근하는 스마트 포인터이다. ( 스마트 포인터란 언제 할당되고 해제되는지를 아는 똑똑한 포인터라는 뜻이다. )



반복자는 조작 방법에 따라 5가지 종류로 나뉠 수 있다.


1. 입력 반복자(input iterator) : 반복자가 가리키는 위치의 데이터를 읽기만 가능한 반복자로 다음 위치로 이동할 수 있다.

2. 출력 반복자(output iterator) : 반복자가 가리키는 위치의 데이터를 쓰기만 가능한 반복자로 다음 위치로 이동할 수 있다.

3. 순방향 반복자(forward iterator) : 입력 반복자와 출력 반복자의 기능과 더불어 가리키는 위치의 데이터를 여러번 읽거나 쓸 수 있고 현재의 위치를 저장하여 동일한 위치에서 다시 순회를 시작할 수 있다.

4. 양방향 반복자(bidirectional iterator) : 순방향 반복자와 반대로 갈 수도 있다. 

5. 임의 접근 반복자(random access iterator) : 양방향 반복자의 기능과 임의의 위치로 상수 시간에 이동할 수 있도록하는 산술연산(+,-)이 가능하다.


컨테이너에는 크게 연속 메모리 기반(Vector,Deque,String)과 노드기반(List,map,set)으로 나뉘는데

연속 메모리 기반 컨테이너는 배열형식이기 때문에 산술연산이 가능한 임의 접근 반복자를 사용하고, 노드 기반 컨테이너는 양방향 반복자를 사용한다.



반복자가 가리키는 값을 변경할 수 있는가 없는가에 따라 상수반복자와 비 상수 반복자로 분류될 수 있다.
상수 반복자는 읽기만 가능하고, 비 상수 반복자는 읽기와 쓰기 모두 가능하다.



반복자 무효화 현상

포인터란 어떤 객체를 가리키고 참조를 통해 객체를 조작하는 용도로 사용된다.
그러나 가리키는 객체가 없는 상태에서 포인터를 참조한다면 문제가 발생하기 마련이다.

반복자가 어떤 컨테이너 내의 원소를 가리키고 있었는데, 그 객체가 사라져 버리면 그 이후 반복자를 통해 원소에 접근하는 것이 불가능해 진다. 보통 반복자가 무효화되는 경우 컨테이너마다 약간 차이가 있지만, 원소의 위치가 바뀔경우 해당원소를 가리키던 반복자가 무효화 된다.

컨테이너가 담고있는 원소의 위치가 바뀌는 경우는 새로운 원소의 삽입이나 기존 원소를 삭제할때 발생한다. 

원소 삭제시 현재 반복자가 가리키는 원소를 삭제하면 반복자는 더이상 유효한 객체를 가리키는 상태가 아니게 된다. 여기서 다음으로 이동하거나, 참조를 하면 문제가 발생한다.

무효화 시키지 않기 위해선 반복자를 지우고 증가시키면된다.