break
関数を使用して、いくつかのネストされたfor
ループを終了することは可能ですか?もしそうなら、どのようにしてこれをやりますか?また、ブレークが何個のループから出るかを制御できますか?
私の知る限りでは、C++はJavaや他の言語のように命名ループをサポートしていません。ジャンプを使用するか、使用するフラグ値を作成することができます。各ループの終わりにフラグの値を確認してください。 trueに設定されている場合は、その反復から抜け出すことができます。
いいえ、break
でそれを台無しにしないでください。これがgoto
を使うための最後の要塞です。
入れ子になったループから抜け出すためのもう1つの方法は、両方のループを別々の関数に分割し、終了するときにその関数からreturn
を呼び出すことです。
もちろん、これは最後から以外の場所で関数から明示的にreturn
を使うべきかどうかというもう一つの議論を引き起こします。
ラムダを使用して明確な答えを追加するだけです。
for (int i = 0; i < n1; ++i) {
[&] {
for (int j = 0; j < n2; ++j) {
for (int k = 0; k < n3; ++k) {
return; // yay we're breaking out of 2 loops here
}
}
}();
}
もちろん、このパターンには一定の制限があり、明らかにC++ 11のみですが、非常に便利だと思います。
breakはそれを含む最も内側のループだけを終了します。
gotoを使用すると、任意の数のループから抜け出すことができます。
もちろん、gotoはよく--- 有害だと考えられます です。
break関数[...]を使うのは適切ですか?
Breakとgotoを使用すると、プログラムの正当性について推論するのが難しくなります。これについての議論はここを見てください: ダイクストラは正気ではなかった 。
このanswearはすでに発表されていますが、私は良いアプローチは次のようにすることだと思います:
for(unsigned int z = 0; z < z_max; z++)
{
bool gotoMainLoop = false;
for(unsigned int y = 0; y < y_max && !gotoMainLoop; y++)
{
for(unsigned int x = 0; x < x_max && !gotoMainLoop; x++)
{
//do your stuff
if(condition)
gotoMainLoop = true;
}
}
}
これはどう?
for(unsigned int i=0; i < 50; i++)
{
for(unsigned int j=0; j < 50; j++)
{
for(unsigned int k=0; k < 50; k++)
{
//Some statement
if (condition)
{
j=50;
k=50;
}
}
}
}
goto
とラベルを使用してネストしたループから抜け出すコード例:
for (;;)
for (;;)
goto theEnd;
theEnd:
いくつかのネストしたループから抜け出すための良い方法の1つは、コードを関数にリファクタリングすることです。
void foo()
{
for(unsigned int i=0; i < 50; i++)
{
for(unsigned int j=0; j < 50; j++)
{
for(unsigned int k=0; k < 50; k++)
{
// If condition is true
return;
}
}
}
}
gotoはネストしたループを壊すのに非常に役立ちます。
for (i = 0; i < 1000; i++) {
for (j = 0; j < 1000; j++) {
for (k = 0; k < 1000; k++) {
for (l = 0; l < 1000; l++){
....
if (condition)
goto break_me_here;
....
}
}
}
}
break_me_here:
// Statements to be executed after code breaks at if condition
break
ステートメントは、それが含まれている中で最も近いdo
、for
、switch
、またはwhile
ステートメントの実行を終了します。制御は終了したステートメントの次のステートメントに渡されます。
msdn から。
私はgoto
がこの状況で有効であると思います:
break
/continue
をシミュレートするには、次のようにします。
for ( ; ; ) {
for ( ; ; ) {
/*Code here*/
if (condition) {
goto theEnd;
}
}
}
theEnd:
for ( ; ; ) {
for ( ; ; ) {
/*Code here*/
if (condition) {
i++;
goto multiCont;
}
}
multiCont:
}
PHPなどの他の言語では、ブレークアウトするネストループレベルの量を指定するためにbreakのパラメータ(つまりbreak 2;)を使用できますが、C++では使用できません。ループの前にfalseに設定したブール値を使用し、ブレイクする場合はループ内でtrueに設定し、ネストしたループの後にブール値がtrueに設定されているかどうかをチェックする条件ブレイクを使用して解決する必要があります。そしてもしそうなら壊れなさい。
私はこれが古い記事であることを知っています。しかし、私は少し論理的で簡単な答えを提案します。
for(unsigned int i=0; i < 50; i++)
{
for(unsigned int j=0; j < conditionj; j++)
{
for(unsigned int k=0; k< conditionk ; k++)
{
// If condition is true
j= conditionj;
break;
}
}
}
1つのbool
変数で任意の数のループを解除します。以下を参照してください。
bool check = true;
for (unsigned int i = 0; i < 50; i++)
{
for (unsigned int j = 0; j < 50; j++)
{
for (unsigned int k = 0; k < 50; k++)
{
//Some statement
if (condition)
{
check = false;
break;
}
}
if (!check)
{
break;
}
}
if (!check)
{
break;
}
}
このコードでは、break;
すべてのループ。