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부분이 남달랐습니다만 

잘 동작하고 있습니다.


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

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

새해복 많이 받으십시오.