Maison >développement back-end >C++ >Comment supprimer en toute sécurité des éléments d'un vecteur dans une boucle C ?
Suppression d'éléments d'un vecteur dans une boucle
Une tâche courante lorsque l'on travaille avec des vecteurs consiste à supprimer des éléments spécifiques en fonction de leurs attributs. Cependant, la mise à jour du vecteur lors de son itération peut entraîner des erreurs inattendues.
Considérons l'extrait de code 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 du jeu les joueurs avec zéro ou moins d'argent. vecteur tous les joueurs. Cependant, l'exécution de ce code entraîne souvent le message d'erreur :
La fonction 'operator =' n'est pas disponible dans 'Player'
Cause de l'erreur :
L'erreur se produit car std::vector::erase utilise en interne l'opérateur d'affectation (=) pour déplacer les éléments dans le vecteur. Pour utiliser l'effacement, la classe Player doit implémenter l'opérateur d'affectation.
Solution sans opérateur d'affectation :
Pour éviter l'exigence d'opérateur d'affectation, commentez la ligne it dans le loop:
for (vector<Player>::iterator it = allPlayers.begin(); it != allPlayers.end(); /*it++*/) { if (it->getpMoney() <= 0) it = allPlayers.erase(it); }
En supprimant l'incrément it, l'itérateur avance automatiquement après chaque effacement opération.
Refactoring à l'aide de l'idiome Erase-Remove :
Une solution plus propre consiste à utiliser l'idiome Erase-Remove, qui fournit un moyen concis et efficace de supprimer des éléments de un vecteur :
allPlayers.erase( std::remove_if( allPlayers.begin(), allPlayers.end(), [](Player const & p) { return p.getpMoney() <= 0; } ), allPlayers.end() );
Dans cette approche, std::remove_if filtre le vecteur en fonction du fourni expression lambda. Les éléments filtrés sont ensuite supprimés à l'aide de std::vector::erase.
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!