2016-08-16 118 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这样的值给它。你将不得不退回到一个正常的迭代器循环来做到这一点。