如何使用std::reverse_iterator擦除*AND CONTINUE* ?

How do you erase *AND CONTINUE* using a std::reverse_iterator?

本文关键字:AND CONTINUE 擦除 何使用 std reverse iterator      更新时间:2023-10-16

我一直在研究stackoverflow,甚至是Dobbs博士那篇非常非常好的文章,但我找不到这个问题的明确答案。

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(),但我正在寻找这个特定问题的答案。

应该是

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

我见过的大多数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;
    }
}