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() <p>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 :</p><blockquote>La fonction 'operator =' n'est pas disponible dans 'Player'</blockquote><p><strong>Cause de l'erreur :</strong></p><p>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.</p><p><strong>Solution sans opérateur d'affectation :</strong></p><p>Pour éviter l'exigence d'opérateur d'affectation, commentez la ligne it dans le loop:</p><pre class="brush:php;toolbar:false">for (vector<player>::iterator it = allPlayers.begin(); it != allPlayers.end(); /*it++*/) { if (it->getpMoney() <p>En supprimant l'incrément it, l'itérateur avance automatiquement après chaque effacement opération.</p><p><strong>Refactoring à l'aide de l'idiome Erase-Remove :</strong></p><p>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 :</p><pre class="brush:php;toolbar:false">allPlayers.erase( std::remove_if( allPlayers.begin(), allPlayers.end(), [](Player const & p) { return p.getpMoney() <p>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.</p>
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!