2011-12-23 64 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