Как вы удаляете * И ПРОДОЛЖАЕТЕ *, используя std :: reverse_iterator? - PullRequest
9 голосов
/ 24 декабря 2011

Я был на взлете и падении стека и даже очень, очень хороший Доктор.Статья Доббса , но я не могу найти однозначного ответа на вопрос.

В разделе ответа на вопрос Каковы недостатки std :: reverse_iterator? говорит, чтоэто может быть вообще невозможно.


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: я знаю, что есть другие альтернативы, такие как erase_if (), но я ищу ответ на этот конкретный вопрос.

Ответы [ 2 ]

15 голосов
/ 24 декабря 2011

Это должно быть просто

std::list<int>::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;
   }
}
0 голосов
/ 24 декабря 2011

Большинство erase() реализаций, которые я видел, возвращают следующий итератор в последовательности именно для такой ситуации, например:

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