2017-05-30 77 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

它肯定會「重要」。 –