簡體   English   中英

迭代列表時C ++從列表中刪除

[英]C++ removing from list while iterating over list

我有一個std::list Bananas std::list ,我想擺脫壞的。 是否有任何相對簡單的方法來執行以下偽代碼?

foreach(Banana banana in bananaList)
{
    if(banana.isBad()) bananaList.remove(banana);
}

(從C#和Java轉換到C ++是一條艱難的道路。)

bananaList.remove_if(std::mem_fun_ref(&Banana::isBad));

請注意,你可能應該使用std::vector而不是std::list盡管 - 在99.9%的情況下, vector表現更好,並且它更容易使用。

編輯:如果你使用向量,向量沒有remove_if成員函數,所以你必須使用命名空間std的普通remove_if

bananaVector.erase(
    std::remove_if(bananaVector.begin(), bananaVector.end(), std::mem_fun_ref(&Banana::isBad)), 
    bananaVector.end());

你通常會這樣做:

list.erase(std::remove_if(list.begin(), list.end(), std::mem_fun(Banana::isBad)), list.end());

編輯:由於remove_if被實現為std::list的成員函數,Billy ONeal的回答可能是更好的方式來完成所描述的工作,盡管如果你決定使用vector,deque時這會更容易轉換等等,正如評論中已經討論的那樣,這可能是一件好事。

您可以使用自制程序代碼

for(list<...>::iterator it=bananas.begin(); end=bananas.end(); it!=end;) {
  if(... decide ...) {
    it=bananas.erase(it);
  } else
    ++it;
}

或者,您可以使用list::remove_if方法或std::remove_if函數(也可以使用vector )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM