2014-10-15 3 views
0

Я не совсем уверен, что этот вопрос действительно касается контейнеров, пожалуйста, несите меня.Какой контейнер выбрать?

Игра имеет «повороты», которые увеличиваются, и нет таймера, который срабатывает в определенное время.

Теперь есть также большое ведро объектов, где некоторые из них нуждаются в обновлении. Что будет происходить в том, что объект o1 должен быть обновлен в n1 поворотами, объект o2 в n2 и т.д.

Простое решение будет:

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. Например, в таком контейнере (при условии, object::ctr имеет типа size_t)

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

Это требует немного обслуживания, как вы должны убедиться, чтобы избавиться от пустых векторов однажды один конкретный ковш работает пустым. Но в случае, если вы не нуждаетесь в элементе ctr abywhere else, вы можете полностью удалить его и сохранить итерацию по всей коллекции (вы просто перемещаете векторы из одного ведра в следующий меньший).

+0

Я думаю, что этот подход все равно означал бы ездить по всем контейнерам в каждом повороте, перемещая объекты в следующую меньшую. На самом деле не вижу, как это лучше, чем алгоритм выше. – Bersaelor

+0

Нет, как я пытался объяснить, вам не нужно прикоснуться к каждому «объекту», вы просто перемещаете векторы, которые * могут * быть реализованы в постоянное время для каждого векторного перемещения.Конечно, если вы получите действительно разреженные векторы, он будет дегенерировать. Это потребует от вас: a) удалить член 'ctr' из объектов' object' или b) пула 'ctr' и поделиться ими по всем« объектам »в одном и том же векторе, поэтому вам нужно только их декрементировать. – bitmask

Смежные вопросы