0

以下のコードが連続ループで実行されない理由を知りたいと思います。また、私が達成したいことを達成するためのいくつかの方法を探しています。それは、ループ内のループをリセットすることです。コンテナ内の各要素を考慮する必要があるため、これを行う必要があります。これは、途中から始めて、ループバックして他の情報を確認する必要があり、他の情報も再確認する必要があるためです。私の小さなテスト例では、次のようになります。

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

上記が機能しない特別な理由はありますか?私はその理由を知ることに非常に興味があるので、すべてがどのように機能するかを学ぶことができます。これはまた、私が直面しているはるかに大きな問題につながります。これは以下のコードです。MSVC ++2010Expressを使用しています。また、これは1つのスレッドであるため、他のデータはそれにアクセスしていません。これは、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が提供しなければならないフィードバック、および学ぶべき新しいことを感謝します:-)さらに情報が必要な場合は、私が提供します。お時間をいただきありがとうございます。

4

1 に答える 1

3

ループの本体に入る前に条件がチェックされるためです。の場合、 10と評価されるi == 10時間にコードを実行する前に、ループが中断されます。i++

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 + 1iそうすれば、elseブロックをデインクリメントする必要はありません。

ポストインクリメントについてのあなたの誤解は、おそらくあなたが投稿したコードの2番目のブロックのバグの原因でもあります。これをプレインクリメントに変更できます。または、itがランダムアクセスイテレータの場合は、上記と同じことを実行して、ブロックでit + 1 == gpc_map_ptr->end()デインクリメントする必要があるかどうかを確認できます。itelse

于 2012-09-25T19:07:00.857 に答える