Iterator란

Iterator는 컨테이너의 원소들을 순회 할 수 있는 객체


반복자는 컨테이너의 특정 위치를 가리킴

반복자는 Pointer와 같이 연산자를 사용할 수 있는데 pointer와 비슷

 

operator *         :     현재 가리키고 있는 위치 값

operator ++      :     다음 원소

operator --        :     이전 원소

operator != , == :      두 반복자가 같은 위치를 가리키고 있는지

operator =         :     반복자를 할당합니다.

 

가만히 보면 pointer와 비슷해 보인다.. 좀 다르다고 할 수 있는건 복잡한 컨테이너를 순회할 수 있는 스마트포인터라는 것입니다. 나중에 예제로 보겠지만 컨테이너::iterator 로 지정해주면 지정한 컨테이너 타입에 맞춰 움직이다가 iterator 알아서 메모리 관리가 됩니다. 지정한 자료의 삭제 같은 것이 필요 없다는 것이죠.

 

컨테이너에 보면 가지고 있는 원소를 순회하기 위해 공통 멤버 함수가 있습니다. 간단하게

begin() 과 end()을 보도록 하죠.


 


여기꽤 중요한 것이 있는데 end()는 마지막을 하나 지난 위치 입니다.  이걸 half-open range(반 개방 범위)라고 하는데요 

2가지 장점이 있습니다. 꼭 장점만 있지는 않습니다.. 잘못처리 하면 문제일으킬 소지를 다분히 가지고 있습니다.

 

  1.원소를 순회하는 루프를 간단히 할 수 있다. end()에 다다르지 않았다면 계속해서 루프를 돌면 된다.

  2.빈 범위에 대해서 특별한 처리를 할 필요가 없다. 빈 컨테이너에 대해서 begin()과 end()는 동일하다.

 

이런 특성 때문에 for 문을 작성할 때


for(vector<char>::iterator a = c.begin ; a != c.end() ; ++a)


와 같은 식으로!= 로 비교하고 ++a 를 사용합니다. end() 같지 않을 때 까지 계속 이동하면서 증가를 합니다.

증가 연산은 전위(prefix operator)를 사용합니다. 

이유는 class에서 증가연산자를 overloading 해 보셨다면 왜인지 아실것 같은데 후위(postfix)는 반복자의 이전값을 반환하기 때문에 임시로 객체가 생깁니다.

아무래도 전위 증가/감소가 성능이 좋겠죠. 후위를 써도 괜찮긴 하지만 사용하지 마세요.

 

그리고 iterator은 두 가지가 있는데

container::iterator   원소들을 읽기/쓰기 가능합니다.

container::const_iterator   읽기 전용으로 순회합니다


출처 : http://egloos.zum.com/ErinSyndrome/v/913685

'Programming > openCV' 카테고리의 다른 글

vector에 접근하는 두가지 방법  (0) 2017.04.11
13. Hough Circles  (0) 2017.04.04
12. Templet Matching  (0) 2017.04.04
11. Emboss, sketch, 수채화  (0) 2017.04.04
10. 마우스로 영역을 지정한 부분만 엣지 검출  (0) 2017.04.04

+ Recent posts