如何使用范围循环迭代器删除元素

时间:2016-08-16 16:37:36

标签: c++11 std future

我试图从

中删除元素
std::list<std::future<void>> my_list;

使用

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

不起作用!我相信它是因为std::future是可移动的类型。任何建议将不胜感激。

2 个答案:

答案 0 :(得分:0)

@Html.ActionImage(null, null, "../../Content/img/Button-Delete-icon.png", Resource_en.Delete, new{//htmlAttributesForAnchor href = "#", data_toggle = "modal", data_target = "#confirm-delete", data_id = user.ID, data_name = user.Name, data_usertype = user.UserTypeID }, new{ style = "margin-top: 24px"}//htmlAttributesForImage ) 不是迭代器,它的类型为itr

std::list::erase只接受迭代器,因此您无法将std::future<void>之类的值传递给它。你将不得不回到正常的迭代器循环来做到这一点。

答案 1 :(得分: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
}