2012-05-22 3 views
1

은 내가 이런 식으로 반복하는 동안지도가 :std :: map에 반복하면서 삽입하는 중입니까?

std::map<unsigned int, GameObject *>::iterator itr = _gameObjects.begin(); 
    while (itr != _gameObjects.end()) 
    { 
     itr->second->Update(); 
     itr++; 
    } 

업데이트() 맵에 요소를 삽입하거나 심지어에서 하나를 제거 할 수 있습니다,하지만 반드시 두 가지 중 하나를 수행하지 않습니다. 분명히 그런 식으로 작동하지 않습니다. 그것이 할 수있는 방법이 있습니까? std::map::erase()에서

+1

에 다시 할당 할 수 있습니다. 어떤 키를 'Update()'할 수 있습니까? 새로운 요소가 반복자의 현재 위치 앞에 삽입되면 어떤 행동을 원합니까? – Mankarse

+0

'Update()'자체를 제거 할 수 있습니까? – hmjd

+0

@hmjd 지금 당장 가능합니다. – tschaei

답변

4

는 : 삭제 된 요소에

참조 및 반복자가 무효화됩니다. 다른 참조 및 반복기는 영향을받지 않습니다. std::map::insert()에서

:

없음 반복자 또는 참조는 무효화되지 않습니다. std::map::operator[]에서

:

없음 반복자 또는 참조는 무효화되지 않습니다.

Update()은 코드 자체를 삭제하지 않습니다. Update()의 경우에는 그렇지 않습니다. Update()은 플래그를 설정하거나 다음 반복자 (Attila에서 제안한대로)를 반환하는 경우 자체를 제거한 경우 호출 코드에 알릴 것이 요구됩니다.

+0

) 10 초 후에 저를 이깁니다. – Brady

+0

Thanks . 즉, Update()에 설정된 GameObject 클래스에 boolean _erase를 추가하고 루프에서 요소 제거를 처리하도록해야합니다. – tschaei

1

STL의 erase 함수는 일반적으로 다음 유효 요소 (이 요소를 사용할 수없는 경우 end())로 반복자를 반환합니다. 이 반복자를 Update에서 되돌리고 itr

관련 문제