midas+son의 크리에이티브(creative) 이야기

지난번 UI를 만들 때

벡터에 있는 객체들을

순차적으로 그려줄때

맨 마지막 벡터 객체가 맨 위로 올라오게 됩니다.


업데이트 순서는 그러면 역순으로 처리해야 

창이 겹칠때의 처리 영역이 올바르게 동작하는데

일반 iterator로는 역순으로 검색도 못하고 

erase 할 때에도 문제가 있더라고요.


그래서 구글링으로 찾아본 결과

reverse_iterator 라는 존재를 알게 되었습니다.


오늘은 이 reverse_iterator 에 대한 정리입니다.


헤더에 아래외 같이 벡터와 이터레이터 

역순 검색을 위한 reverse_iterator 를 설정했습니다.

비교를 위해 일반 iterator 도 주석으로 보여놨습니다.


vector<userInterface*> _vUI;

//vector<userInterface*>::iterator _viUI;

vector<userInterface*>::reverse_iterator _vriUI;



실제 cpp코드에서 사용할 때에는 아래와 같았습니다.


//역순 검색 -> reverse_iterator 사용

if (!_vUI.empty()) //비어있지 않다면

{

for (_vriUI = _vUI.rbegin(); _vriUI != _vUI.rend();) //반복문 에 rbegin(), rend()은 reverse용 begin(), end()라고 생각하심 됩니다.

{

//보여지는 상태이냐?

if ((*_vriUI)->isShow())

{

//그러면 업데이트

(*_vriUI)->update();

++_vriUI;

}

else

{

//삭제

(*_vriUI)->release();

_vriUI = vector<userInterface*>::reverse_iterator(_vUI.erase(_vriUI.base() - 1)); 

//reverse_iterator 형으로 바꾸어 주어야 합니다. 지우는 위치는 _vriUI.base() - 1

}

}

}


erase부분이 남달랐습니다만 

잘 동작하고 있습니다.


벡터를 역순으로 탐색 하고자 하는 분들은 참고하시면 되시겠습니다.

그럼 오늘은 구정 전날이므로

새해복 많이 받으십시오.

이미 개발 된 것들 Detail 살리는 작업 및 마무리 준비


이제 다음 글은 

설연휴 지나서

최종 동영상 예정

◇ Astar 길찾기 개선
 - 매번 모든 Tile값들을 new로 동적 할당 하던 것을 ReSet()함수로 변경
 - 마우스 좌클릭으로 움직일 때마다 FPS가 떨어지는 것 개선 됨(FPS 50 이하 -> 58이상) 
 - STL중 크기가 일정치 않고 계속 변하는 Vector를 List로 변경
 - Close List에 있는 값을 모두 따라가는 것을 도착지에서 parentNode만 따라가도록 변경




오늘 작업 중 기억 남는 점
1. new를 할 때마다 부하가 많이 발생하므로 이미 있는 것들을 재활용 하는 것이 좋음
2. 벡터(vector)에 일정하게 push_back 할 때는 미리 reserve 로 크기를 지정해 주자
3. 보관할 양이 매우 가변적일 때에는 vector보다는 List가 더 용이함
4, vector는 지정된 양을 넘으면 메모리를 2배로 늘리면서 새로 복사됨을 기억하자