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.