2011-12-23 44 views

回答

15

这应该只是

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

我会试试看。你怎么弄出来的? (只是要求学习如何学习) – Migs 2011-12-23 23:19:33

+0

@Migs,反向迭代器的不变量是:&&(reverse_iterator(i))==&*(i - 1)'。从那里向后映射(或者考虑删除'rbegin()'),然后在答案中找到代码。 – MSN 2011-12-23 23:22:48

+0

谢谢@MSN。它工作完美。我在多布斯的文章中读到了这个不变性,但我想我无法理解它的含义。我会一直盯着,直到有希望发生。 – Migs 2011-12-23 23:25:35

0

大多数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; 
    } 
} 
+0

这是正确的。但是,擦除是结构的成员,而不是迭代器。因此,无论您是使用迭代器还是reverse_iterator,erase()都会接受并返回一个迭代器。没有r_erase(),它接受并返回一个reverse_iterator。 – 2015-01-30 04:03:37