Publish:

태그: , ,

카테고리:

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

* operator

iterator 는 포인터 라고 했다.

이 iterator 의 값을 확인하려면 *iterator 라고 작성하여야 한다.

* 연산자를 사용하기 위해 * operator 를 구현해보자.

코드

1
2
3
4
5
6
// iterator 클래스 내부
public:
  T& operator* ()
  {
    return m_pData[m_iIdx];
  }

이렇게 추가해주면

1

다음과 같이 오류가 뜨지 않게 된다.

하지만 아직 값은 확인할 수 없다. iterator 가 어떤 주소값을 가리키는지 알 수 없기 때문이다.

begin()

이제 vector 에 begin() 함수를 추가할 것이다.

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// CArr 클래스 내부
public:
  // iterator 클래스 밑부분에 선언하거나 iterator 클래스를 전방선언 해주어야 한다.
  // 반환형이 iterator 이기 때문이다.
  iterator begin();

// iterator 클래스 내부
public:
  iterator(T* _pData, int _iIdx)
    : m_pData(_pData), m_iIdx(_iIdx)
  { }

// CArr 클래스 외부
template<typename T>
typename CArr<T>::iterator CArr<T>::begin() // inner class 
{
    if(m_iCount == 0)
        return iterator(m_pData, -1);
    return iterator(m_pData, 0);
}

중요한 것은 begin() 함수는 iteraotr, 즉 inner class 를 반환하는 형태라는 것이다.

이럴 때는 함수 앞에 typename 이라는 타입에 대한 정보를 알려주어야 한다.

그리고 begin() 함수를 참조형으로 반환해서 원본을 알려주어야 한다고 생각할 수 있다.

하지만 원본 이라고 부를 데이터가 없다.

참조형으로 반환을 하려면 지역변수로 iterator iter(m_pData, 0); return iter; 와 같이 해야하지만

iter 는 함수가 끝나면 사라져버릴 지역변수 이므로 이를 참조하는 것은 상당히 위험하다.

그렇기에 반환형은 iterator 로 한다.

동작시켜보자.

동작

2

3

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

업데이트:

댓글남기기