Saltar al contenido

Eliminar elementos de un vector dentro del ciclo

Comprende el código correctamente previamente a usarlo a tu trabajo y si ttienes algo que aportar puedes comentarlo.

Solución:

No debes incrementar it en el for círculo:

for (vector::iterator it=allPlayers.begin(); 
                              it!=allPlayers.end(); 
                              /*it++*/) <----------- I commented it.


   if(it->getpMoney()<=0) 
      it = allPlayers.erase(it);
  else 
      ++it;
 

Note la parte comentada;it++ no es necesario allí, como it se está incrementando en el propio cuerpo for.

En cuanto al error "La función 'operator =' no está disponible en 'Player'", proviene del uso de erase() que utiliza internamente operator= para mover elementos en el vector. Para usar erase()los objetos de clase Player debe ser asignable, lo que significa que debe implementar operator= por Player clase.

De todos modos, debes evitar el bucle sin procesar.1 tanto como sea posible y debería preferir usar algoritmos en su lugar. En este caso, el popular Erase-Remove Idiom puede simplificar lo que estás haciendo.

allPlayers.erase(
    std::remove_if(
        allPlayers.begin(), 
        allPlayers.end(),
        [](Player const & p)  return p.getpMoney() <= 0; 
    ), 
    allPlayers.end()
); 

1. Es una de las mejores charlas de Sean Parent que he visto.

if(allPlayers.empty() == false) 
    for(int i = allPlayers.size() - 1; i >= 0; i--) 
        if(allPlayers.at(i).getpMoney() <= 0) 
            allPlayers.erase( allPlayers.begin() + i ); 
        
    

Esta es mi forma de eliminar elementos en vector. Es fácil de entender y no necesita ningún truco.

Olvídese del loop y use los algoritmos de rango estándar o boost.
Usando Boost.Range en Lambda se vería así:

boost::remove_if( allPlayers, bind(&Player::getpMoney, _1)<=0 );

Sección de Reseñas y Valoraciones

Si posees alguna cuestión o disposición de ascender nuestro crónica te sugerimos realizar una crónica y con placer lo estudiaremos.

¡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 *