2017-05-30 41 views
0

这是我的循环;从(int&i:i)获取当前迭代器

for (sf::TcpSocket &client : clients) 
{ 
    ... 
} 

在循环中,我想检查是否有人已经断开,如果是这样,从用户的列表中删除他们,我只是不知道如何检查它是由在哪个用户名单。

用户列表是循环中的100 sf :: tcpsockets 的向量,如果有人已经断开连接,我只是用continue语句跳过其余代码。

我通过发送“ping”检查他们是否断开连接,如果没有给出响应,则断开连接。

有用户的一个列表,这被命名基于客户对循环

+5

元回答:如果你想修改范围本身,不要使用这种循环。 –

+1

用户列表是什么?而实际的'std :: list'?或者像你想要索引到的'std :: vector'那样的随机访问?或者你有参考的'客户'? – doctorlove

+2

另外,'std :: remove_if'可能已经成功了。 –

回答

1

范围不应该是容器本身的修改。如果你想从容器中添加或删除元素,你应该使用一个标准的for循环:

for (auto it = std::begin(clients); it != std::end(clients);) 
{ 
    sf::TcpSocket& client = *it; 
    // accept data from the client socket 

    if (acceptStatus == sf::Socket::Disconnected) 
    { 
     it = clients.erase(it); 
     erased = true; 
    } 
    else 
    { 
     ++it; 
    } 
} 

注意,迭代器不会增加,因为for循环后置条件的一部分。如果我们这样做了,当一个元素被擦除时,迭代器将会增加,这不是你想要的,因为你会不小心跳过一个元素。

+3

'bool'非常嘈杂。只需使用'else'? –

+0

如果你想要的话,你可以使用'else'。 – Gambit

+2

它肯定会“重要”。 –