2014-10-15 3 views
0

이 질문이 컨테이너에 관한 것인지 정말로 모르겠다. 나와 함께 참아주십시오.선택할 컨테이너는 무엇입니까?

게임에는 '차례'가 증가하고 특정 시간에 시작되는 타이머가 없습니다.

개체 수가 많아서 몇 가지 항목을 업데이트해야하는 곳도 있습니다. 무엇 일어날 것은 객체 O1 등 N2에서 N1 회전, 객체 O2 업데이트 할 필요가 있다는 것입니다

간단한 솔루션 것 :

for (object* o : objectVector) { 
    o->ctr--; 
    if (o->ctr == 0) { o->update(); }; 
} 

지금 나는 1000을 통해 크롤 경우이 몹시 비효율적 인 느낌 개체는 각 턴마다 카운터를 10 개 업데이트합니다. 어딘가에이 문제가 발생했다고 확신합니다!

또한 개체가 예상 업데이트를 +/- 몇 번씩 업데이트하는 것을 허용 할 수 있습니다.

나는 많은 벡터들을 가질 수 있다고 생각했는데, 다음 5 개의 벡터, 5-10의 벡터, 미래의 10-15 개의 벡터 등등. 그러나 그때 나는 너무 많은 벡터를 가지고 있는데, 말하자면 100 턴만 업데이트하면된다.

+3

나는 코드가 컨테이너에있는 것이 아니라 객체의 복사본을 수정한다는 사실에 더 관심이 있습니다. – juanchopanza

+0

미안하지만 아이디어를 설명하기위한 의사 코드 일 뿐이므로 프로그램의 실제 코드와 비슷하게 만들 것입니다. – Bersaelor

+1

"하지만 너무 많은 벡터가 있습니다"- "너무"많습니까? 왜? 나에게 완벽하게 좋아 보인다. 당신은 매 차례마다 하나씩 가질 수 있습니다. –

답변

1

실제로 이것은 문제가 될 경우 object::ctr 값으로 그룹화 할 수있다. 이러한 컨테이너에 예를 들어 당신이 한 번에 하나의 특정 버킷이 비어 실행 빈 벡터를 제거 할 수 있는지 확인해야 이것은, 유지 보수의 비트가 필요

::Std::unordered_map<size_t, ::std::vector<object*>> 

(object::ctr을 가정하는 것은 size_t을 입력있다). 그러나 다른 사람이 abywhere 회원을 필요로하지 않는 경우에는 완전히 제거하고 전체 컬렉션에 반복을 저장할 수 있습니다. 벡터를 한 버킷에서 다음 버킷으로 이동하면됩니다.

+0

이 접근법은 모든 컨테이너를 순환하면서 다음 차례로 작은 객체로 객체를 이동시키는 것을 의미한다고 생각합니다. 위의 알고리즘이 어떻게 더 좋은지 실제로 알 수는 없습니다. – Bersaelor

+0

아니요, 설명하려고했듯이 모든 단일 객체를 건드릴 필요가 없습니다. 각 벡터 이동에 대해 일정 시간 내에 구현할 수있는 벡터 만 이동하면됩니다.물론, 당신이 정말로 희미한 벡터를 얻는다면 그것은 퇴화 될 것입니다. 이렇게하려면 a)'ctr' 멤버를'object'에서 제거하거나 b)'ctr' 객체를 풀어서 같은 벡터의 모든'objects '에서 공유해야합니다. 따라서 한 번만 감소시켜야합니다. – bitmask

관련 문제