📁 개발 히스토리

C++ - 벡터 클래스 구현하기(2)

일단몸통박치기 2022. 11. 8. 14:27

빨리 해치우고 유니티 디자인 패턴 공부해야한다. 미룰라고 했지만 벡터 클래스 안써놓으면 무조건 까먹을 거 같아서...

지금 지식의 정수를 남겨놓아야만 한다.

 

요기까진 간단하다.

Capacity 달라길래 리턴해주고

size 달라길래 리턴해줬다.

 

id를 추가하는 것도 우선 capacity에 데이터가 가득 차 있는지 확인하고

가득 안 차있으면 바로 새 요소를 추가해준다.

가득 차있으면 capacity를 두배로 늘리고 현재 값을 temp에 넣어서

capacity, temp, size에 맞춰 다시 재할당. 그리고 요소를 추가한다.

 

꽤 고생한 함수.

일단 반환형이 포인터라서 found라는 놈을 지정해줬다.

원래는 포인터 두개 넣고 A가 이동하면서 찾다가 찾으면 B에 값을 전달. B를 리턴, 하려고 했는데

좀 생각해보니 첫번째 요소만 반환하면 되서 그냥 찾는 순간 바로 for문 탈출하고 리턴하게 바꿨다.

 

for문은 i=0에서 시작하고 사이즈와 같아질때까지 반복하면....... 안되지 않나?

이걸 지금 보네... size는 1부터 시작하고 array는 0부터 시작하니까 size=array는 쓰레기값인데 멍청했다.

어쨌든 찾으면 found는 포인터니까 &를 써서 주소를 저장하고 리턴시킨다.

못찾으면 기본값인 nullptr을 반환한다. << 이거는 아마 NULL이랑 다른 포인터용 널값 같은거? 다.

 

TrimToSize는 지금 사이즈 만하게 capacity를 줄이고 재할당한다.

아무래도 2배씩 capacity가 증가하니까 쓸모없는 공간이 너무 늘어날 걸 염려해서 공간확보용 함수인것 같다.

 

다음은 또 오퍼레이터(연산자) 오버로딩인데 []를 이용해서 arr값을 구경가능하도록 만들어준다.

Main에서 이런 식으로 접근한다.

그냥 벡터[인덱스]로 배열에 접근 할 수 있고 벡터[인덱스].변수 = 3; 아마 이런것도 가능하다.

 

 

이것도 처음 보고 되게 난감했는데(어떻게 벡터를 표현하라는 거지?)

다 쓰고 실행해보려니까 string으로 반환해야한다는 걸 알았다ㅋㅋㅋ...

그래서 그냥 시간도 없고 무지성으로 id, id, id, id, 이렇게... 문자열 추가해서 리턴시켰다

 

가독성 떨어지는 걸 알지만......

일단 이 함수는 특정 조건(id=3이라던가)에 맞는 요소를 전부 삭제하고 다시 재할당하는 함수다.

시간이 없어서 그냥 처음 만든대로 입력하다보니 쓸모없는 변수도 많고 가독성도 매우 구리다...

 

이런 식으로 작동한다.

 

만약에 id값이 3인 오브젝트를 찾으면 Match 배열에 인덱스(int)를 저장한다.

그리고 일치하는 오브젝트 갯수 세는 변수(NumMatch)도 ++해준다.

 

다시 만약에 일치하는 오브젝트 갯수가 없다면 재할당을 실행하고 아니면 함수를 끝냅니다.

 

재할당은 이렇게 진행된다.

temp에 현 배열을 저장한다.

arr에는 다시 공간을 할당해주고

copy는 기본 true(늘 카피한다)

 만약에 match에 있는 값(int)와 일치하는 인덱스 값이면 copy를 false로

copy가 true인 인덱스들만 새로운 arr에 할당합니다.

단, 이때 사이즈는 resize를 통해 추가될때마다 ++하는 방식으로 인덱스를 정렬해준다.

 

사용한 temp값도 삭제하고 size는 resize값으로 초기화한다.