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
Libérer: 2024-12-10 03:55:21
original
1061 Les gens l'ont consulté

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

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

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

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 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