我需要选择一个容器来容纳指向我定义的类型的指针(Particle
)。我正在使用预先分配的粒子Object Pool
(其中包含预先分配在std :: vector上的对象)。什么是STL容器来执行元素之间的移除?
我的粒子发射器在粒子池需要发射时要求粒子池(为了避免游戏中的粒子分配)。当一个粒子到期时,它返回到粒子对象池。你可以看到,当我迭代我的粒子参考容器(需要选择一个)来更新它时,我将不得不检查哪些粒子已经过期(lifetime <= 0.0
)并将它们返回给粒子池,过期的颗粒可能在容器中的任何位置。
我一直在思考如何使用std::list
,这里的原因:
名单(据我所知)提供了在开始一定时间的插入和恒定时间去除在任何时候(假设你已经迭代到这一点)。
欢迎任何对我的系统的建议或改进,以便更好地适应您的容器建议。
EDIT:
为了解释自己好一点:
颗粒在发射极的寿命时间是不完全相同,这取决于一个范围,例如,5.0秒+ - (0.0至0.5)。这是为了给粒子一个随机性元素,并且在固定时间内看起来比所有粒子都好。
算法伪代码:
// Assume typedef std::container_type<Particle *> ParticleContainer
void update(float delta)
{
ParticleContainer::iterator particle = m_particles.begin();
for(; particle != m_particles.end(); ++particle)
{
updateParticle(*particle, delta); //Update the particle
if ((*particle)->lifeTime <= 0.0)
{
ParticlePool.markAsFree(*particle); //Mark Particle as free in the object Pool
m_particles.remove(*particle); //Remove the Particle from my own ParticleContainer
}
}
}
对于顺序容器,总是从'std :: vector'开始。然后配置文件,如果容器操作是一个问题,请尝试另一个容器。 [通常你会发现自己坚持'std :: vector'。](http://stackoverflow.com/questions/5056973/when-do-you-prefer-using-stdlistt-instead-of-stdvectort/5057001#5057001 ) – sbi 2011-03-10 19:34:05
“恒定时间”和std :: list的问题是常数很大!对于std :: vector,时间是可变的,但很小。你的选择! :-) – 2011-03-10 19:53:43