Maison >développement back-end >C++ >Comment supprimer en toute sécurité des éléments d'un vecteur dans une boucle C ?

Comment supprimer en toute sécurité des éléments d'un vecteur dans une boucle C ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-10 03:55:21971parcourir

How to Safely Remove Elements from a Vector in a C   Loop?

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!

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