Supprimer des éléments d'un vecteur dans une boucle
Il est essentiel de savoir comment supprimer efficacement des éléments d'un vecteur lors des itérations de boucle. Tenter de le faire en utilisant le code suivant peut entraîner une erreur :
for (vector<Player>::iterator it = allPlayers.begin(); it != allPlayers.end(); it++) { if(it->getpMoney() <= 0) it = allPlayers.erase(it); else ++it; }
Le message d'erreur "La fonction opérateur '=' n'est pas disponible dans 'Player'", indique que les objets du vecteur ne peuvent pas être directement réaffecté. Pour résoudre ce problème, la classe Player doit implémenter l'opérateur d'affectation (=).
De plus, la boucle for doit être modifiée pour éviter d'incrémenter explicitement l'itérateur, car cela est déjà géré en interne :
for (vector<Player>::iterator it = allPlayers.begin(); it != allPlayers.end(); ) { if(it->getpMoney() <= 0) it = allPlayers.erase(it); else ++it; }
Au lieu d'utiliser une boucle brute, il est recommandé d'exploiter l'idiome Erase-Remove pour une plus grande efficacité :
allPlayers.erase( std::remove_if( allPlayers.begin(), allPlayers.end(), [](Player const & p) { return p.getpMoney() <= 0; } ), allPlayers.end() );
Ceci idiom utilise l'algorithme Remove_if pour filtrer les éléments qui remplissent la condition spécifiée (les joueurs avec de l'argent nul ou négatif dans ce cas), puis utilise la fonction d'effacement pour les supprimer du vecteur.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!