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 ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-06 07:19:11333parcourir

How to Safely Remove Elements from a Vector While Iterating in 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 &amp; 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!

Déclaration:
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