這看起來像一個簡單的問題,它當然是可行的,但我想有效地做到這一點。有效地從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迭代器,但編譯器不喜歡這種情況。
刪除使用一個反向迭代雙向列表的列表元素似乎是一個合理的事情。有什麼明顯的我在這裏失蹤?
你可以在反向迭代器上調用'base()',但你需要自己照顧正確的偏移量。 –
@KerrekSB你能詳細點嗎?我不太瞭解迭代器知道如何使用您的建議。 – vacuumhead
我可能在這裏錯過了一個潛臺詞,[但是爲什麼不'pop_back'?](http://en.cppreference.com/w/cpp/container/list/pop_back) – user4581301