J'ai le code qui ressemble à ceci:Pouvez-vous supprimer des éléments d'une liste std :: en l'itérant?
for (std::list<item*>::iterator i=items.begin();i!=items.end();i++)
{
bool isActive = (*i)->update();
//if (!isActive)
// items.remove(*i);
//else
other_code_involving(*i);
}
items.remove_if(CheckItemNotActive);
Je voudrais supprimer des éléments inactifs immédiatement après leur mise à jour, afinde pour éviter de marcher à nouveau la liste. Mais si j'ajoute les lignes commentées, j'obtiens une erreur quand j'arrive à i++
: "Liste l'itérateur non incrémentable". J'ai essayé quelques alternatives qui n'ont pas été incrémentées dans la déclaration for, mais je n'ai rien pu faire.
Quelle est la meilleure façon de supprimer des éléments lorsque vous marchez dans une liste std :: list?
parfait, travaillé comme un charme. – AShelly
En fait, ce n'est pas garanti de travailler. Avec "erase (i ++);", nous savons seulement que la valeur pré-incrémentée est passée à erase(), et que i est incrémenté avant le point-virgule, pas nécessairement avant l'appel à erase(). "itérateur prev = i ++; effacer (prev);" est sûr de travailler, comme est l'utilisation de la valeur de retour –
Non James, i est incrémenté avant d'appeler l'effacement, et la valeur précédente est passée à la fonction. Les arguments d'une fonction doivent être entièrement évalués avant l'appel de la fonction. –