2017-02-27 89 views
-1

編輯:這個問題是指專門爲std ::名單 - 堆棧溢出其他類似的問題涉及到std ::向量C++列表進行迭代和擦除

我使用C++和遇到問題從一個std刪除元素::列表,而迭代它。我有一個自定義類(「對象」這一問題的緣故),列表和我的代碼如下所示:

for(auto i : Objects) 
    if(i.EraseFlag == true) 
     { 
      i = Objects.erase(i); 
     } 

,我發現了錯誤:「呼叫到std沒有匹配功能: :列表::擦除(對象&)'

我相信這是正確的方式(從C++ 11)迭代通過列表,刪除一個元素並返回一個迭代器,考慮刪除,但清楚我做錯了什麼。以前在使用矢量時,我會使用'Objects.erase(Objects.begin()+ i)',我是for循環中的一個整數,但考慮到列表的訪問需求,這不起作用。

幫助讚賞。

感謝

+0

erase()將迭代器作爲其參數 –

+1

您不應該在基於'for'循環的範圍內更改序列。 – PaulMcKenzie

+1

*我相信這是正確的方式(從C++ 11開始)遍歷列表,擦除元素並返回考慮擦除的迭代器,* - 爲什麼要使用這種方法擦除這樣的事情擦除/刪除成語,不需要循環? – PaulMcKenzie

回答

1

成員函數erase涉及迭代器。

對於這樣的任務,使用普通的for循環是正確的。例如

for (auto it = Objects.begin(); it != Objects.end();) 
{ 
    if (it->EraseFlag) it = Objects.erase(it); 
    else ++it; 
} 

另一種方法是使用成員函數remove_if。例如

Objects.remove_if([](const auto &value) { return value.EraseFlag; }); 
+0

感謝Vlad,你的初始循環似乎工作。它看起來使用remove_if將是最好的做法,你也包括在內,所以我將其標記爲答案 – nathanburns

+0

@nathanburns根本沒有。不用謝。 –