vector 구현해보기! (4)
카테고리: CppStudy
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 의 끝까지 주소값을 하나씩 증가시킨다는 것이다.
동작
사용해보면 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 주소값을 옮겨다니게 된다.
다음과 같이 정의만 해놓고 호출해보면 잘 작동한다.
이제 우리가 어떤 동작들을 구현해야 하는가? 에 대해 고민해 보아야 한다.
iterator 는 포인터라고 했다.
그렇기 때문에 *iter
는 물론 주소값 증감 혹은 비교를 위해 ++ , -- , == , !=
연산자가 필요하며
++ , --
연산자는 전위, 후위 연산자가 모두 필요하다.
또 필요한 것은 vector 내부에 begin() , end()
함수도 필요하다.
다음 글에서 이를 구현해보자.
댓글남기기