2016-08-16 166 views
0

我試圖從如何使用範圍循環迭代

std::list<std::future<void>> my_list; 

刪除元素使用

for(auto& itr:my_list) { 
    if (/*something*/) 
     my_list.erase(it) 
} 

不起作用刪除元素!我相信它是因爲std::future是可移動的類型。任何意見,將不勝感激。

+0

這個問題不應該與「MovableType的」被標記。 Movable Type是一個類似於Wordpress的內容管理系統。 –

回答

0

您正在使用基於範圍的for循環。這樣的循環不能用來擦除容器中的元素。你可以使用std::remove_if代替:

auto new_end = std::remove_if(my_list.begin(), my_list.end(), cond); 
my_list.erase(new_end, my_list.end()); 

其中cond是返回true如果未來應刪除功能:

bool cond(const std::future<void>& fut) 
{ 
    if (/* something */) 
     return true; // fut will be erased from list 
    else 
     return false; // fut will be kept in list 
} 
+0

是removed_if thread_safe?如果列表正在從多個線程更新,它是否仍然有效?謝謝! – Pal

+0

@Pal:你需要圍繞你的列表進行某種線程同步;在這種情況下不會爲你做。 – AndyG

0

itr不是迭代器,它是std::future<void>類型。

std::list::erase只接受迭代器,所以你不能傳遞一個像itr這樣的值給它。你將不得不退回到一個正常的迭代器循環來做到這一點。