Maison >développement back-end >C++ >Comment supprimer en toute sécurité des éléments d'un vecteur lors d'une itération en C ?
Suppression d'éléments d'un vecteur à l'intérieur d'une boucle
Lors de l'itération sur un vecteur à l'aide d'une boucle for, une tâche courante consiste à supprimer des éléments en fonction sur des critères précis. Cependant, tenter de supprimer un élément dans la boucle elle-même peut entraîner des erreurs.
Considérez le 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 tente de supprimer du vecteur les joueurs avec de l'argent négatif ou nul. tous les joueurs. Cependant, cela entraîne le message d'erreur :
La fonction 'operator =' n'est pas disponible dans 'Player'
Le problème
L'erreur survient car la méthode delete() utilise en interne l'opérateur d'affectation = pour déplacer les éléments dans le vecteur. Pour utiliser Eraser(), les objets Player doivent être assignables, ce qui nécessite une implémentation de Operator= pour la classe Player.
La solution
Pour résoudre le problème, évitez de l'incrémenter dans la boucle for :
for (vector<Player>::iterator it = allPlayers.begin(); it != allPlayers.end(); /*it++*/) { if(it->getpMoney() <= 0) it = allPlayers.erase(it); }
Implémentez l'opérateur = pour la classe Player pour permettre l'attribution d'objets dans le vecteur.
Approche alternative utilisant des algorithmes
Pour simplifier le code, envisagez d'utiliser l'idiome Effacer-Supprimer :
allPlayers.erase( std::remove_if( allPlayers.begin(), allPlayers.end(), [](Player const & p) { return p.getpMoney() <= 0; } ), allPlayers.end() );
Ce code utilise le L'algorithme std::remove_if() pour filtrer les joueurs avec de l'argent négatif ou nul, puis utilise l'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!