1

I want both loops to stop as soon as I find an object that has the same position in x.

Here is my C++ code:

for(int i = 0; i < sizeArray; ++i){
    for(int j = i; j > 0; --j){
        if (s[i].positionX == s[j-1].positionX){
            s[i].positionY = s[j-1].positionY; 
        }
    }
}

If I use break; it only breaks out of the inner for loop. What is the best way to stop both?

Options:

  1. Set the indexes of the loops to max value (or min value) to terminate the loop.
  2. Put all this inside a function and use return.
  3. Use a goto
  4. Use a Lambda
  5. Set a boolean stop code to true, break, then listen for break and break out of other loop?
  6. ?
4

6 に答える 6

4

for最も内側のループから抜け出すには、 を使用しますbreak

最も外側のものから抜け出すには、「停止すべき」フラグをgoto使用するか、 と の組み合わせを使用します。break

于 2013-10-14T15:46:30.957 に答える
3

ラムダをお勧めします:

auto do_work = [&] {
   for(int i = 0; i < sizeArray; ++i){
       for(int j = i; j > 0; --j){
           if (s[i].positionX == s[i-1].positionX){
               s[i].positionY = s[i-1].positionY; 
               return;
           }
       }
   }
};

do_work();  //you can call this multiple times if you need to!

いいえbreak、いいえgoto。:-)

breakこの場合はand と同じ目的を果たしますgotoが、少なくとも私にとっては、テクニックはきれいに見えます。また、ラムダに名前(適切な名前) があれば、必要に応じて何度でも使用できます。この手法により、コードの可読性が向上し、コードの再利用が促進されます。

もちろん、これを複数回呼び出す必要がない場合は、おそらく名前は必要ありません。あなたはこれを行うことができます:

[&]
{
   //your code with the added return statement.
}();

しかし、私が言ったように、name何度も呼び出さなくても可読性が向上します。


何らかの理由でラムダを使用できない場合でも、次のような追加の変数の使用stopとそれに関連する追加の作業を回避できます(@ssantosの回答が示唆するように):

for(int i = 0; i < sizeArray; ++i){
    for(int j = i; j > 0; --j){
        if (s[i].positionX == s[i-1].positionX){
            s[i].positionY = s[i-1].positionY; 
            i = sizeArray; //it will break the outer loop!
            break;
        }
    }
}

それが役立つことを願っています。

于 2013-10-14T15:49:20.817 に答える
2

forループを停止するように求めていると思います。あなたが探しているキーワードはbreakです。ただし、両方のforループを終了する場合は、コードに変数を追加する必要があります.-

bool stop = false;

for(int i = 0; i < sizeArray; ++i){
    for(int j = i; j > 0; --j){
        if (s[i].positionX == s[i-1].positionX){
            s[i].positionY = s[i-1].positionY; 
            stop = true;
            break;
        }
    }
    if (stop) {
        break;
    }
}
于 2013-10-14T15:45:00.507 に答える
1

forでループを止めることができますbreak

ネストされたforループでは、物事はそれほど簡単ではありません。あなたはあなたの目標を達成することができます

  • フラグを設定して(done = 1;そしてそれを使用してfor(int j = i; j > 0 && !done; --j)
  • またはでgotogoto一部の人々は眉をひそめていますが、正しく注意して使用すれば、エラー処理、または一般的には「終了処理」などの問題の正当な解決策になる可能性があります。
于 2013-10-14T15:47:17.353 に答える