가변배열에서의 iterator
private의
T* == 8바이트, int 두개 8바이트
long long == 8바이트
그러면 가변배열 CArr객체를 하나 만들면 몇 byte노?
=> 24바이트하면 바보병신임.
iterator 클래스가 안에 선언되어있네?
CArr(가변배열) 객체 하나만들면,
iterator애도 뭐 시발 서비스로 딸려 들어오는 것이노?
ㄴㄴ. 아님
완전 별개의 "자료형"이다.
vector는 벡터고
애는 애대로 객체를 따로 또 만들었다.
집 만들었는데 책상도 같이 안 만들어진다.
각각 다 다른 클래스
vector까지는 템플릿이고 < T > 정해주면
그런 타입의 클래스가 만들어 지는 것이고,
그런 클래스 안에 구현되어있는 iterator이기 때문에
다들 서로 다른 자료형이다.
iterator는 뭘 알아야하나
시작주소, 인덱스
iterator container는 시작주소랑 인데스 번호 알면 씹가능임.
CArr클래스 안에 일단 T* 템플릿 자료형의 시작 주소(dataAddr)이랑
indexNumber 가지고 있도록 하자.
지금 begin을 vector int :: iterator veciter가
받고있는데
받을 수 있는 이유가 begin함수의 반환 타입이 iterator이기 때문이다.
그러면 begin은 vecInt의 멤버 함수이니까
먼저 begin함수를 vector < T >의 멤버 함수로 선언을 해준다.
그런데 반환이 iterator 인데 이것을 먼저 위에 선언해놓으면 컴파일러가 iterator 클래스가 있는지 없는지 모르기때문에
"전방 선언" 만 해주고 뒤에 다시 구현해준다.
그러면 굳이 begin함수 위치 옮길 필요가 없다.
beign -> Ctrl + '+' + '.' =>
이런데 반환타입이 iterator이고 CArr< T > :: being 맞는데
특정 type이라는 것을 명시하기 위해서
typename이라고 명시를 해준다음에
CArr < T > 의 iterator가 반환타입이고
CArr < T > :: (의) begin() 함수를 구현한다는 말이다.
지역변수로 iterator iter를 선언해준다. => iterator 객체의 생성자가 호출되면서 초기값을 셋팅한다.👍👍
iter.m_pData는 지금 begin함수를 호출 하는 객체의 m_pData를 받고,
iter의 indexNumber는 0으로 할당해주고
이 iter객체를 반환을 해주어야한다.
그러면 iter를 반환받은 쪽에서는 begin함수를 호출한 객체가
자신의 m_pData를 알고 m_iIndx를 아는 상태이고
지금 iter라는 객체는 begin함수가 종료가되면 스택에있다가 사라짐.
현재 iterator iter라는 객체를 만들어서
해당 객체의 m_pData, m_iIdx의 값을 할당을 해서 iter를 컨테이너를 반환하고있는데
이럴꺼면 생성자를 오버로딩해서 반환하는게 더 효율 좋을듯.
이렇게 오버로딩 해줄 수 있을 것이다.
그러면
이랫던 부분이.
이렇게 수정이 가능하다.
그런데 지금 지역변수를 만들고 바로 반환해주는데
이것을 또한,
이렇게 변수명을 짓지도 않고 바로 반환 해준다.
(임시객체를 만들어 줘버리고 바로 반환 하는 것임)
전위/후위, --, ==, != 다 만들어야함.