重置循环中的循环

时间:2012-09-25 19:05:22

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

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

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--;
    }
}

我感谢所提供的任何反馈,以及任何需要学习的新内容:-)如果需要进一步的信息,我会提供。谢谢你的时间。

1 个答案:

答案 0 :(得分:3)

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

请记住,postincrement会增加变量并返回旧值。因此,如果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。这样您就不必在i块中减去else

您对postincrement的误解可能也是您发布的第二个代码块中的错误来源。您可以将其更改为preincrement,或者如果it是随机访问迭代器,您可以执行与上述相同的操作并检查是否it + 1 == gpc_map_ptr->end()而不必减少itelse区块。