【问题标题】:Resetting a loop in a loop在循环中重置循环
【发布时间】:2012-09-25 19:05:21
【问题描述】:

我很好奇为什么下面的代码不能连续循环运行。而且我也在寻找一些方法来实现我想要实现的目标——即重置循环内部的循环。我需要这样做,因为我需要考虑容器中的每个元素。之所以这样,是因为我可能从中间开始,需要循环回去检查其他信息/并且还需要重新检查其他信息。继续我的小测试示例:

for ( int i = 0; i != 10; i++ ) {
    std::cout << std::endl << "TEST: " << i << std::endl;
    if ( i++ == 10 ) {
        i = 0;
    } else {
        i--;
    }
}

上述方法不起作用有什么特别的原因吗?我很想知道为什么,所以我可以了解一切是如何运作的。这也导致了我面临的一个更大的问题。这是下面的代码。我正在使用 MSVC++ 2010 Express。此外,这是一个线程,因此其他数据无法访问它。它是一个使用 STL 的 unordered_map。如果为 2(我检查过),则它的大小。

for (game_player_client_map::const_iterator it = gpc_map_ptr->begin(); it != gpc_map_ptr->end(); ++it) {
    if ( it++ == gpc_map_ptr->end() ) {
        cout << endl << "IT == gpc_map_ptr->end()" << endl;
        it = gpc_map_ptr->begin();
    } else {
        it--;
    }
}

感谢 SO 提供的任何反馈,以及任何要学习的新事物 :-) 如果需要更多信息,我会提供。感谢您的宝贵时间。

【问题讨论】:

  • i=9; std::cout &lt;&lt; i++;

标签: c++ stl for-loop unordered-map


【解决方案1】:

因为在进入循环体之前检查了条件。当i == 10 时,循环中断,在您的代码可以在i++ 评估为10 的时间执行之前。

请记住,后增量会增加变量并返回旧值。因此,如果i 为 9,i++ 的计算结果也为 9,但下次使用 i 时,它将为 10。

如果您希望变量递增并在表达式中使用新值,请使用 preincrement:

if (++i == 10) // changes i to i + 1 and checks if the new value of i is 10

但是,您可以完全放弃增量,而只需使用 i + 1。这样您就不必在 else 块中减少 i 的增量。

您对后增量的误解可能也是您发布的第二段代码中的错误来源。您可以将其更改为预增量,或者如果it 是一个随机访问迭代器,您可以执行与上述相同的操作并检查it + 1 == gpc_map_ptr-&gt;end() 是否不必在else 块中减少it .

【讨论】:

  • 非常感谢赛斯。我不知道后期和预增量。而这些新信息将变得非常有价值。让我再次感到惊讶。
  • @Ohmages 是的,在表达式中使用后/前增量很棘手,使用正确的增量至关重要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-26
  • 1970-01-01
  • 2018-07-25
相关资源
最近更新 更多