CPP_어소_62_iterator (3)

CJB_ny·2022년 7월 4일
0

CPP_AROTHO

목록 보기
61/83
post-thumbnail

iterator는 어떤 객체의 첫번째 주소를 알고있는 것이다.

(데이터 변수의 이름이 첫번째 주소이다.)

우리가 구현한 것은 문제점이 하나있는데

가변배열이라 데이터를 계속 넣다보면 Resize를 해서 새로운 2배 크기의 메모리를 할당한다.

그러면 iterator는 2배로 커진 새로운 메모리 주소값을 가르켜야하는데

지금 이 기능이 없다.

즉 데이터를 늘린 객체가 이 새로 할당받은 주소를 알고있다.

그러면 iterator라는 innerclass는

데이터를 늘린 객체를 알면된다.

(그럼 자동적으로 dataAddr을 알 수 있으니까 멤버 변수라)

예전의 begin의 주소❗❗❗

지금 처음에 data를 2개만 넣은 상태에서 iterator 에다가 begin해서 주소를 받아왔다.

그런데

for문을 돌면서 계속 재할당을 하는데

그럴때마다 재할당한 데이터의 첫번째 시작 주소가 다르기 때문에

69번째 줄에서 시작 주소를 받아왔던 것은

for문이 끝나고 나서의 시작 주소와 분명히 다르다.

=> 현재주소와 새로 할당받은 주소가 다르다는 것을 인식할 수 있어야한다.

따라서

vector의 inner class인 iterator가

private으로 주소값과 인덱스 번호를 알고있는데

주소값을 알게 아니라

vector의 객체를 알고있으면

vector가 알아서 주소 갱신을 하니까 좀더 좋을듯 하다.

이렇게 iterator의 멤버 변수 추가하고 생성자도 이에 맞게 수정을 해준다.

이렇게

inner class의 문법특성

  1. CArr을 범위 지정연산자로 접근을해서 iterator를 지칭을 해주어야한다. CArr::iterator 이런식으로

  2. ❗❗ private 멤버에 접근이 가능하다.

    외부에서는 접근이 불가능 한데

이 멤버변수들은

iterator라는 클래스는 접근이 가능하다.

inner class는 private멤버에 접근이 가능함.

이에따라 begin 함수 수정

그러면 인자를 받는 생성자로 임시객체를 만드는데

인자로 그럼 어떻게 수정되어야하나?

this가 들어가 주어야한다❗

begin이 vector < int > 의 멤버 함수이니까.


이렇게 되어야함.

iterator operator 오버로딩

n_dataAddr가 데이터 들의 시작 주소 이기 때문에

여기의 인덱스번호에 접근을 해서

그것의 타입이 뭔지는 모르니까 T이고 그것의 데이터의 참조(주소)를 반환을 하겠다.

그러면 받는 쪽에서도 수정이 가능함. (참조==주소를 가지고있으니까)

중간에 비교를 해보야야한다.

이럴경우

m_pArr의 dataAddr != m_dataAddr

begin의 불안요소

우리가 end를 뭘로 배웠나??

마지막 데이터 다음이라 배움

데이터가 2개라면 화살표 방향이 가르키는 곳이 end

1개라면, 0개라면 아무것도 없는 곳이 end이다.

즉, begin이 end이다.

end

마지막 보다도 다음.

end iterator 역참조?

데이터가 아무것도 없는 부분을 역참조해서 데이터 접근을 한다??

=> 바로 에러.

(우리는 지금 end iterator의 경우 indexNumber를 -1로 보기로 한 상태이다)

그래서

operator * 에 if문 조건에 하나 더 들어야하무.

또 다른 문제

++iter 은 ㄱㅊ. 근데, end iterator에서 전위 연산자 또 한다는 것은 말이 안된다.

아무것도 없는데 병신아.

또한 begin에서 거꾸로 가는 것도 말이 안된다.

operator overloading ++, -- ❗❗❗

int k = 0;
++(++k);

이거 연산이 어떻게 되나?

먼저 ++k수행하면

=> ++(k); 이거다

그러면 "++" 연산자의 반환 타입이 뭐냐?

자기 자신이 되어야 하지 않을까??

=> 그래야 다시 ++k 와 같은 연산이 가능하니까

그러면

iterator& operator ++ () {}

이런식으로 될 것이다.

지금 ++를 호출한 this가 iterator 가 될 것이니까

자기 자신을 되돌려주어야한다. 본인 자체(*this)를 반환하는데

ref로 그대로 참조해서 보내겠다라는 말이다.

혼자 복습 ㄱㄱ 👍👍👍

profile
https://cjbworld.tistory.com/ <- 이사중

0개의 댓글