Какой контейнер выбрать?

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

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

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

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

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

Теперь я чувствую, что это ужасно неэффективно, если я пролистываю 1000 счетчиков объектов за ход, просто чтобы обновить, может быть, 10 из них.
Я уверен, что эта проблема возникла раньше где-то!

Кроме того, я, вероятно, могу позволить объектам иногда обновляться на +/- на несколько оборотов вокруг ожидаемого обновления.

Я думал, что у меня может быть много векторов, один на следующие 5, один на 5-10, один на 10-15 ходов в будущем и так далее. Но тогда у меня слишком много векторов, если некоторые объекты нужно обновить, скажем, за 100 витков ..

0

Решение

Если это действительно проблема, вы можете сгруппировать их по object::ctr значение. Например в таком контейнере (при условии object::ctr имеет тип size_t)

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

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

1

Другие решения


По вопросам рекламы [email protected]