Supprimer des éléments d'un vecteur dans une boucle
Lors d'une itération sur un vecteur, il peut y avoir des scénarios dans lesquels vous devez supprimer des éléments en fonction de certains critères. Cependant, tenter de modifier le vecteur lors de l'itération peut entraîner des erreurs d'exécution.
Considérez le scénario suivant :
for (vector<Player>::iterator it = allPlayers.begin(); it != allPlayers.end(); it++) { if (it->getpMoney() <= 0) it = allPlayers.erase(it); else ++it; }
Ce code vise à supprimer les joueurs avec de l'argent nul ou négatif. Cependant, il échoue avec une erreur liée à l'opérateur d'affectation. Pour résoudre ce problème, évitez d'incrémenter l'itérateur dans la boucle. Au lieu de cela, comptez sur l'itérateur renvoyé par la fonction Eraser().
for (vector<Player>::iterator it = allPlayers.begin(); it != allPlayers.end(); /*it++*/) { if (it->getpMoney() <= 0) it = allPlayers.erase(it); else ++it; }
De plus, l'utilisation de Operator= par la fonction Eraser() nécessite que la classe Player soit assignable, ce qui signifie que la classe Player doit implémenter un opérateur d'affectation.
Effacer-supprimer l'idiome pour la manipulation de vecteurs
Pour simplifier la tâche de en supprimant des éléments d'un vecteur, adoptez l'idiome Erase-Remove :
allPlayers.erase( std::remove_if( allPlayers.begin(), allPlayers.end(), [](Player const & p) { return p.getpMoney() <= 0; } ), allPlayers.end() );
Cet idiome combine l'algorithme Remove_if() pour identifier les éléments à effacer et la méthode Eraser() pour supprimer la plage requise.
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!