我正在创建一个游戏,其中有小的“粒子”。它们的数量非常频繁地变化(每几秒钟一次),我想知道最好的存储它们的方式是什么。对于这个问题,std::vector
或 std::deque
哪一个更好呢?
如果在容器中保留永远不会被使用的空间(我有上限),这样做是否可以?
我正在创建一个游戏,其中有小的“粒子”。它们的数量非常频繁地变化(每几秒钟一次),我想知道最好的存储它们的方式是什么。对于这个问题,std::vector
或 std::deque
哪一个更好呢?
如果在容器中保留永远不会被使用的空间(我有上限),这样做是否可以?
如果顺序不重要(我认为它确实不重要),您可以在向量中将一个粒子替换为另一个粒子,而不是删除它。
std::vector<Particle> particles;
当您删除索引i
处的粒子时 - 只需使用最后一个粒子填充空白空间:
particles[i] = particles.back();
particles.pop_back();
如果使用指针向量,您甚至可以使其更快。
swap
呢? - pmrparticles[i] = std::move(particles.back())
,获得两全其美的效果。当然,这意味着你的代码依赖于C++11。 - Steve Jessop关键在于使用。如果您的向量未排序,并且您实际上正在删除该粒子,则在向量中查找它的复杂度为O(n),并且整个向量将被复制,以便数据保持连续。对于双端队列,仍需要O(n)来查找,但是删除操作很简单。但是,如果您正在进行迭代操作
foreach (particle in particles)
{
if(particle.update() == END_OF_LIFE)
{
particle.alive = false;
}
else
{
particle.draw();
}
}