2016-04-22 117 views
8

這看起來像一個簡單的問題,它當然是可行的,但我想有效地做到這一點。有效地從std :: list中刪除最後一個元素

目標
如果滿足條件,則從std :: list中刪除最後一個元素。

的問題
我的編譯器(MSVC++ 10)是不滿鑄造一個反向迭代爲常量迭代方法調用到std :: list.erase()。該消息是:

error C2664: 'std::_List_iterator<_Mylist> 
std::list<_Ty>::erase(std::_List_const_iterator<_Mylist>)' : cannot 
convert parameter 1 from 'std::reverse_iterator<_RanIt>' to 
'std::_List_const_iterator<_Mylist>' 

我試過驗證碼:

std::list<mytype> mylist; 

// lots of code omitted for clarity 
bool ends_badly = true; 

while(ends_badly && mylist.size() > 0) 
{ 
    auto pos = mylist.crbegin(); // Last element in the list 
    if ((*pos)->Type() == unwanted) 
    { 
     mylist.erase(pos); // Here is where the compiler complains 
    } 
    else 
    { 
     ends_badly = false; 
    } 
} 

我能解決這個問題,通過使用前向迭代器,並通過列表來結束循環,但這是如此繁瑣。在這種情況下,編譯器可以使用前向迭代器,我嘗試將一個反向迭代器轉換爲一個const迭代器,但編譯器不喜歡這種情況。

刪除使用一個反向迭代雙向列表的列表元素似乎是一個合理的事情。有什麼明顯的我在這裏失蹤?

+0

你可以在反向迭代器上調用'base()',但你需要自己照顧正確的偏移量。 –

+0

@KerrekSB你能詳細點嗎?我不太瞭解迭代器知道如何使用您的建議。 – vacuumhead

+5

我可能在這裏錯過了一個潛臺詞,[但是爲什麼不'pop_back'?](http://en.cppreference.com/w/cpp/container/list/pop_back) – user4581301

回答

8

我想,可以簡化您的代碼段做下一個方法:

while (!mylist.empty() && mylist.back()->Type() == unwanted) { 
    mylist.pop_back(); 
} 
+2

'mylist.back() - > Type()== unwanted'更簡單。 – SirGuy

+0

@GuyGreer完全同意你的看法,編輯我的答案。 –

相關問題