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 ?

Comment supprimer en toute sécurité des éléments d'un vecteur lors d'une itération en C ?

Barbara Streisand
Libérer: 2024-12-04 04:09:13
original
181 Les gens l'ont consulté

How to Safely Remove Elements from a Vector During Iteration in C  ?

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;
}
Copier après la connexion

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;
}
Copier après la connexion

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 &amp; p) { return p.getpMoney() <= 0; }
  ),
  allPlayers.end()
);
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal