Saltar al contenido

¿Cómo borrar y eliminar punteros a objetos almacenados en un vector?

Posterior a de una larga búsqueda de información dimos con la respuesta esta cuestión que suelen tener algunos los lectores. Te brindamos la respuesta y nuestro objetivo es que te sea de mucha ayuda.

Solución:

Tienes que tener cuidado porque erase() invalidará los iteradores existentes. Sin embargo, devolverá un nuevo iterador válido que puede usar:

for ( it = Entities.begin(); it != Entities.end(); ) 
   if( (*it)->getXPos() > 1.5f ) 
      delete * it;  
      it = Entities.erase(it);
   
   else 
      ++it;
   

La forma “correcta” de hacer esto es usando un algoritmo:

#include 
#include 

// this is a function object to delete a pointer matching our criteria.
struct entity_deleter
{
    void operator()(Entity*& e) // important to take pointer by reference!
     
        if (e->GetXPos() > 1.5f)
        
            delete e;
            e = NULL;
        


// now, apply entity_deleter to each element, remove the elements that were deleted,
// and erase them from the vector
for_each(Entities.begin(), Entities.end(), entity_deleter());
vector::iterator new_end = remove(Entities.begin(), Entities.end(), static_cast(NULL));
Entities.erase(new_end, Entities.end());

Ahora sé lo que estás pensando. Estás pensando que algunas de las otras respuestas son más cortas. Pero, (1) este método generalmente se compila en un código más rápido: intente compararlo, (2) esta es la forma STL “adecuada”, (3) hay menos posibilidades de errores tontos y (4) es más fácil de leer una vez que puedas leer el código STL. Vale la pena aprender programación STL, y le sugiero que consulte el gran libro de Scott Meyer “Effective STL”, que tiene muchos consejos de STL sobre este tipo de cosas.

Otro punto importante es que al no borrar elementos hasta el final de la operación, no es necesario revolver los elementos. GMan estaba sugiriendo usar una lista para evitar esto, pero usando este método, toda la operación es O(n). El código de Neil anterior, por el contrario, es O(n^2), ya que la búsqueda es O(n) y la eliminación es O(n).

if((*it)->getXPos() > 1.5f)

   delete *it;
   it = Entities.erase(it);

No se te olvide dar visibilidad a este artículo si si solucionó tu problema.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *