我创建了一个函数来执行此操作:
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语句中
我知道这个问题已经被问了很多,但我真的很困惑。
以下是完整文件:
请注意我的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.获得了代码。它无法正常工作并返回相同的错误。
答案 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
之类的内容