【问题标题】:get current iterator from for(int &i : i) [duplicate]从 for(int &i : i) [重复] 获取当前迭代器
【发布时间】:2017-10-30 20:09:57
【问题描述】:

这是我的循环;

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

在循环中,我想检查是否有人断开了连接,如果是,则将其从用户列表中删除,我只是不知道如何检查列表中的哪个用户。

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

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

有一个用户列表,被命名为客户

【问题讨论】:

  • 元回答:如果要修改范围本身,请不要使用这种循环。
  • 用户列表是什么?而实际的std::list?或者像std::vector 这样您希望索引到的随机访问?或者你有参考的client
  • 另外,std::remove_if 可能已经成功了。
  • 所以,只是为了 (int i = 0; i
  • 最后,您如何知道它们是否已断开连接?

标签: c++


【解决方案1】:

基于范围的 for 循环不应该用于修改容器本身。如果你想在容器中添加或删除元素,你应该使用标准的 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 循环后置条件的一部分而递增。如果我们这样做了,当一个元素被删除时,迭代器将会增加,这不是你想要的,因为你会不小心跳过一个元素。

【讨论】:

  • 那个bool 很吵。只需使用else?
  • 如果你愿意,你可以使用else,这并不重要。
  • 它确实“很重要”。
猜你喜欢
  • 1970-01-01
  • 2021-06-09
  • 1970-01-01
  • 2016-01-18
  • 2015-01-16
  • 2013-04-26
  • 1970-01-01
  • 2023-03-29
  • 2014-04-06
相关资源
最近更新 更多