9 votes

Comment effacer *ET CONTINUER* en utilisant un std::reverse_iterator?

J'ai parcouru stackoverflow de long en large et même le très, très gentil article du Dr. Dobbs mais je ne trouve pas de réponse définitive à la question.

Une partie de la réponse à la question Quels sont les défauts de std::reverse_iterator ? dit que cela pourrait ne pas être possible du tout.

std::list::reverse_iterator it = list.rbegin();

while(  it != list.rend() )
{
   int value=*it;
   if( some_cond_met_on(value) )
   {     
        ++it;
        list.erase( it.base() );
   }
   else
   {
     ++it;
   }
}

PS : Je sais qu'il existe d'autres alternatives, comme erase_if(), mais je recherche une réponse à cette question spécifique.

16voto

MSN Points 30386

Il devrait juste être

std::list::reverse_iterator it = list.rbegin();

while(  it != list.rend() )
{
   int value=*it;
   if( some_cond_met_on(value) )
   {     
        ++it;
        it= reverse_iterator(list.erase(it.base()); // change to this!
   }
   else
   {
     ++it;
   }
}

0voto

Remy Lebeau Points 130112

La plupart des implémentations de erase() que j'ai vues renvoient l'itérateur suivant dans la séquence pour ce type de situation, par exemple :

std::list::reverse_iterator it = list.rbegin();
while( it != list.rend() )
{
    int value = *it;
    if( some_cond_met_on(value) )
    {
        it = list.erase( it );
    }
    else
    {
        ++it;
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X