necesito para recoger un contenedor para contener punteros a un tipo I definida (Particle
). Estoy usando una partícula preasignados Object Pool
(que contienen objetos preasignados en un std :: vector).¿Qué contenedor STL debe realizar la eliminación de elementos intermedios?
Mis emisores de partículas piden a la piscina de partículas para las partículas cuando tienen que emitir, (a fin de evitar la asignación de partículas en el juego). Cuando una partícula caduca, se devuelve al grupo de objetos de partículas.
Como puede ver, mientras recorro mi Contenedor de referencia de partículas (necesito elegir uno) para actualizarlo, tendré que comprobar qué partículas han expirado (lifetime <= 0.0
) y devolverlas al grupo de partículas, las partículas expiradas podrían estar en cualquier posición en el contenedor.
He estado pensando acerca del uso de std::list
, he aquí por qué:
una lista (que yo sepa) proporciona la inserción constante de tiempo al principio, y la eliminación constante de tiempo en cualquier punto (suponiendo que ha reiterado a ese punto).
Cualquier sugerencia o mejoras a mi sistema con el fin de acomodar mejor sus sugerencias contenedores son bienvenidos.
EDITAR:
de explicarme un poco mejor:
El tiempo de vida de las partículas en un emisor es no exactamente lo mismo, depende de una serie, por ejemplo, 5,0 segundos + - (0.0 a 0.5). Esto es para dar a las partículas un elemento de aleatoriedad, y se ve bastante mejor que todo en tiempo fijo.
código Pseudo Algoritmo:
// 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
}
}
}
Para un contenedor secuencial, siempre comience con 'std :: vector'. Luego perfil, y si las operaciones del contenedor son un problema, pruebe con otro contenedor. [Por lo general, te encontrarás a ti mismo con 'std :: vector'.] (Http://stackoverflow.com/questions/5056973/when-do-you-prefer-using-stdlistt-instead-of-stdvectort/5057001#5057001) – sbi
El problema con el "tiempo constante" y std :: list es que la constante es grande. Con std :: vector, el tiempo es variable, pero pequeño. ¡Tu elección! :-) –