2010-06-16 2 views

Répondre

6

Vous n'avez pas besoin d'une boucle que vous êtes face à un ensemble.

std::set<Color>::iterator it = myColorContainer.find(Yellow); 
if (it != it.myColorContainer.end()){ 
    DoSomeProcessing(*it); 
    myColorContainer.erase(it); 
} 
+1

le code est conforme aux normes. Je suis d'accord @Viktor Sehr ce serait le moyen préféré pour supprimer un élément de l'ensemble. Toutefois, la question demande comment faire fonctionner l'extrait de code. –

+0

@daramarak: Je pense que vous avez répondu pendant que j'ai édité le code (je pensais que c'était un vecteur std :: dans mon premier post) –

7

Essayez:

for(std::set<Color>::iterator it = myColorContainer.begin(); 
    it != myColorContainer.end();) { // note missing it++ 
    if((*it) == Yellow) { 
     DoSomeProcessing(*it); 
     myColorContainer.erase(it++); // post increment (original sent to erase) 
    } 
    else { 
     ++it; // more efficient than it++; 
    } 
} 
+0

Cela ne marchera pas non plus. Vous devez lui affecter à nouveau la valeur de retour d'effacement. – Patrick

+0

L'itérateur retourné est une implémentation spécifique à Microsoft qui rompt la norme: http://msdn.microsoft.com/en-us/library/8h4a3515%28VS.80%29.aspx. Effectivement, vous devez incrémenter l'itérateur après l'effacement. –

+1

Cette solution est parfaite si vous ne pouvez pas utiliser l'implémentation spécifique de m $ et devez utiliser une boucle. Si vous n'avez pas besoin d'utiliser une boucle, l'option de Viktor est encore meilleure. Merci pour votre réponse Vous avez été d'une grande aide. – scippie

2
for (std::set<Color>::iterator i = myColorContainer.begin(); 
      i!=myColorContainer.end(); /* No i++ */) 
{ 
    if (*i == Yellow) 
    { 
     DoSomeProccessing(*i); 
     std::set<Color>::iterator tmp = i; 
     ++i; 
     myColorContainer.erase(tmp); 
    } 
    else { 
     ++i; 
    } 
} 

Une fois que vous allez au message suivant avec ++i il est garanti d'être valide - propriété de std::set que itérateurs sur les éléments insérés ne sont jamais invalidées à moins que l'élément est supprimé.

Vous pouvez maintenant effacer en toute sécurité l'entrée précédente.

Questions connexes