Я не совсем уверен, что этот вопрос действительно о контейнерах, пожалуйста, потерпите меня.
В игре есть увеличивающиеся «ходы», нет таймера, который срабатывает в определенное время.
Теперь есть также большое количество объектов, некоторые из которых нуждаются в обновлении. Что произойдет, это то, что объект o1 должен быть обновлен за n1 ходов, объект o2 за n2 и т. Д.
Простое решение будет:
for (object* o : objectVector) {
o->ctr--;
if (o->ctr == 0) { o->update(); };
}
Теперь я чувствую, что это ужасно неэффективно, если я пролистываю 1000 счетчиков объектов за ход, просто чтобы обновить, может быть, 10 из них.
Я уверен, что эта проблема возникла раньше где-то!
Кроме того, я, вероятно, могу позволить объектам иногда обновляться на +/- на несколько оборотов вокруг ожидаемого обновления.
Я думал, что у меня может быть много векторов, один на следующие 5, один на 5-10, один на 10-15 ходов в будущем и так далее. Но тогда у меня слишком много векторов, если некоторые объекты нужно обновить, скажем, за 100 витков ..
Если это действительно проблема, вы можете сгруппировать их по object::ctr
значение. Например в таком контейнере (при условии object::ctr
имеет тип size_t
)
::Std::unordered_map<size_t, ::std::vector<object*>>
Это требует некоторого обслуживания, так как вы должны убедиться, что избавились от пустых векторов, когда одна конкретная корзина опустела. Но если вам не требуется ctr
член еще где-то, вы можете полностью удалить его и сохранить итерацию по всей коллекции (вы просто перемещаете векторы из одного сегмента в следующий меньший).