Publish:

태그: , ,

카테고리:

vector의 iterator 구현해보자!! (4)

iterator 는 무엇일까?

개념

반복자

우리가 반복이라는 개념은 for 문을 통해 배우게 된다.

1
for(int i = 0; i < vector.size(); ++i) { }

반복자라는 개념은 똑같다. 특히 container 를 다룰 때 빼놓을 수 없는 개념이기 때문에 꼭 알아야 한다.

1
for(iter = vector.begin(); iter != vector.end(); ++iter) { }

이렇게 vector 내부를 순회할 수 있게 해준다.

하지만 일반 반복문과 다른 것은 iterator포인터 라는 것이다.

위에서 말하는 .begin().end() 는 위의 그림과 같다.

즉 시작부터 vector 의 끝까지 주소값을 하나씩 증가시킨다는 것이다.

동작

3

4

사용해보면 iterator 가 vector 의 템플릿 내부에서 호출되는 것을 볼 수 있다.

그 이유는 당연하게도 vector 의 템플릿 내부에 정의되어 있기 때문이다.

이를 구현해보자.

iterator 클래스 정의

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// CArr 클래스 내부
// iterator
public:
  class iterator
  {
  private:
    T* m_pData;
    int m_iIdx;
  public:
    iterator()
      : m_pData(nullptr), m_iIdx(-1)
    { }
    ~iterator()
    { }
  };

여기서 m_pData 는 iterator 의 시작주소이며, m_iIdx 는 인덱스이다.

iterator 는 템플릿 내부에서 정의되었기 때문에 자연스럽게 템플릿이 되고

만들어진 자료형에 따라 vector 주소값을 옮겨다니게 된다.

5

다음과 같이 정의만 해놓고 호출해보면 잘 작동한다.

이제 우리가 어떤 동작들을 구현해야 하는가? 에 대해 고민해 보아야 한다.

iterator 는 포인터라고 했다.

그렇기 때문에 *iter 는 물론 주소값 증감 혹은 비교를 위해 ++ , -- , == , != 연산자가 필요하며

++ , -- 연산자는 전위, 후위 연산자가 모두 필요하다.

또 필요한 것은 vector 내부에 begin() , end() 함수도 필요하다.

다음 글에서 이를 구현해보자.

방문해 주셔서 감사합니다!😊

업데이트:

댓글남기기