根据id从列表中删除struct

时间:2017-02-20 22:06:57

标签: c++ list struct

我创建了一个函数来执行此操作:

void Server::removeClient(unsigned short value) {
    std::list<Client>::iterator itri = clients.begin();
    while (itri != clients.end()) {
        if (itri->id == value) {
            itri = clients.erase(itri);
        } else {
            ++itri;
        }
    }
}

但得到错误:

  

列出迭代器不可递增

我一直在寻找类似的问题,例如this one说我在调用erase之后不应该递增我的迭代器,告诉提问者他们应该把他们的迭代器增量放在我有的else语句中

我知道这个问题已经被问了很多,但我真的很困惑。

以下是完整文件:

Server.h

Server.cpp

请注意我的C ++文件,我复制粘贴了mpiatek的问题链接答案,以确保我的代码是正确的。注释掉的代码或当前代码都不起作用。

我还尝试了一个remove_if,由user4581301建议:

clients.erase(
    std::remove_if(clients.begin(), clients.end(), [&](Client const & c) {
    return c.id == value;
}),
    clients.end());

我从this question.获得了代码。它无法正常工作并返回相同的错误。

1 个答案:

答案 0 :(得分:1)

我认为问题不在你所显示的代码中,而是在调用函数中。

您可以在此代码中调用removeClient:

   for (Client &c : clients) {
        c.timeSinceLastPacket+= dt;
        if (c.timeSinceLastPacket.asSeconds() > 10) {
            std::cout << c.id << " has timed out!" << std::endl;
            removeClient(c.id);
        }
    }

一旦removeClient完成了它的工作,你的for循环正在使用的(隐藏)迭代器就会失效,for循环就无法继续。

你可能最好只在外循环中使用迭代器并通过迭代器删除,而不是再次通过ID查找。

更好地使用评论

中建议的std:remove_if之类的内容