Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何停止嵌套for循环_C++_Loops_For Loop_If Statement - Fatal编程技术网

C++ 如何停止嵌套for循环

C++ 如何停止嵌套for循环,c++,loops,for-loop,if-statement,C++,Loops,For Loop,If Statement,我希望当我找到一个在x中具有相同位置的对象时,两个循环都停止 这是我的C++代码: 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; } } } for(int i=0;i0;--j

我希望当我找到一个在x中具有相同位置的对象时,两个循环都停止

这是我的C++代码:

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; 
        }
    }
}
for(int i=0;i0;--j){
如果(s[i].positionX==s[j-1].positionX){
s[i].位置Y=s[j-1].位置Y;
}
}
}
如果我使用
break它仅中断内部for循环。什么是阻止两者的最好方法

选项:

  • 将循环的索引设置为“最大值”(或“最小值”)以终止循环
  • 将所有这些放在函数中并使用return
  • 使用goto
  • 使用Lambda
  • 将布尔停止码设置为true、break,然后侦听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;
        }
    }
    
    bool-stop=false;
    对于(int i=0;i0;--j){
    如果(s[i].positionX==s[i-1].positionX){
    s[i]。位置Y=s[i-1]。位置Y;
    停止=真;
    打破
    }
    }
    如果(停止){
    打破
    }
    }
    
    我猜您要求停止
    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;
        }
    }
    
    bool-stop=false;
    对于(int i=0;i0;--j){
    如果(s[i].positionX==s[i-1].positionX){
    s[i]。位置Y=s[i-1]。位置Y;
    停止=真;
    打破
    }
    }
    如果(停止){
    打破
    }
    }
    
    若要中断最里面的
    循环,请使用
    中断


    要跳出最外层的循环,请使用
    goto
    或使用
    break
    和“应停止”标志的组合。

    要跳出最内层的
    循环,请使用
    break


    要跳出最外层的循环,请使用
    goto
    或使用
    break
    和“应该停止”标志的组合。

    您可以使用
    break
    停止
    for
    循环

    使用嵌套的
    for
    循环,事情就不那么容易了。你可以实现你的目标

    • 通过设置标志(
      done=1;
      并将其与(int j=i;j>0&&!done;--j)的
      一起使用
    • 或者使用
      goto
      。尽管一些人不赞成使用
      goto
      ,但如果使用正确且谨慎,它可能是解决某些问题的合法方法,例如错误处理,或者通常是“已完成处理”

    您可以使用
    中断
    停止
    for
    循环

    使用嵌套的
    for
    循环,事情就不那么容易了。你可以实现你的目标

    • 通过设置标志(
      done=1;
      并将其与(int j=i;j>0&&!done;--j)的
      一起使用
    • 或者使用
      goto
      。尽管一些人不赞成使用
      goto
      ,但如果使用正确且谨慎,它可能是解决某些问题的合法方法,例如错误处理,或者通常是“已完成处理”

      • 我建议兰博达:

        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!
        
        但正如我所说,
        name
        增加了可读性,即使您不多次调用它


        如果出于某种原因不能使用lambda,那么仍然可以避免使用额外的变量,例如
        stop
        ,以及与之相关的额外工作(正如@ssantos的回答所建议的):

        for(int i=0;i0;--j){
        如果(s[i].positionX==s[i-1].positionX){
        s[i]。位置Y=s[i-1]。位置Y;
        i=sizeArray;//它将打破外部循环!
        打破
        }
        }
        }
        

        希望能有所帮助。

        我建议lambda:

        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!
        
        但正如我所说,
        name
        增加了可读性,即使您不多次调用它


        如果出于某种原因不能使用lambda,那么仍然可以避免使用额外的变量,例如
        stop
        ,以及与之相关的额外工作(正如@ssantos的回答所建议的):

        for(int i=0;i0;--j){
        如果(s[i].positionX==s[i-1].positionX){
        s[i]。位置Y=s[i-1]。位置Y;
        i=sizeArray;//它将打破外部循环!
        打破
        }
        }
        }
        
        希望这能有所帮助。

        试试下面的方法

        bool match = false; 
        
        for(int i = 0; i < sizeArray && !match; ++i){
            for(int j = i; j > 0 && !match; --j){
                if ( match = ( s[i].positionX == s[i-1].positionX ) ){
                    s[i].positionY = s[i-1].positionY; 
                }
            }
        }
        
         for(int i = 0; i < sizeArray; ++i){
              int j = i;
              while ( j != 0 && s[i].positionX != s[i-1].positionX ) --j;
              if ( j != 0 ) {
                   s[i].positionY = s[i-1].positionY; 
                   break; 
              }
        }
        
        bool match=false;
        对于(int i=0;i0&!match;--j){
        如果(匹配=(s[i].positionX==s[i-1].positionX)){
        s[i]。位置Y=s[i-1]。位置Y;
        }
        }
        }
        
        另一种方法如下

        bool match = false; 
        
        for(int i = 0; i < sizeArray && !match; ++i){
            for(int j = i; j > 0 && !match; --j){
                if ( match = ( s[i].positionX == s[i-1].positionX ) ){
                    s[i].positionY = s[i-1].positionY; 
                }
            }
        }
        
         for(int i = 0; i < sizeArray; ++i){
              int j = i;
              while ( j != 0 && s[i].positionX != s[i-1].positionX ) --j;
              if ( j != 0 ) {
                   s[i].positionY = s[i-1].positionY; 
                   break; 
              }
        }
        
        for(int i=0;i
        尝试以下操作

        bool match = false; 
        
        for(int i = 0; i < sizeArray && !match; ++i){
            for(int j = i; j > 0 && !match; --j){
                if ( match = ( s[i].positionX == s[i-1].positionX ) ){
                    s[i].positionY = s[i-1].positionY; 
                }
            }
        }
        
         for(int i = 0; i < sizeArray; ++i){
              int j = i;
              while ( j != 0 && s[i].positionX != s[i-1].positionX ) --j;
              if ( j != 0 ) {
                   s[i].positionY = s[i-1].positionY; 
                   break; 
              }
        }
        
        bool match=false;
        对于(int i=0;i0&!match;--j){
        如果(匹配=(s[i].positionX==s[i-1].positionX)){
        s[i]。位置Y=s[i-1]。位置Y;
        }
        }
        }
        
        另一种方法如下

        bool match = false; 
        
        for(int i = 0; i < sizeArray && !match; ++i){
            for(int j = i; j > 0 && !match; --j){
                if ( match = ( s[i].positionX == s[i-1].positionX ) ){
                    s[i].positionY = s[i-1].positionY; 
                }
            }
        }
        
         for(int i = 0; i < sizeArray; ++i){
              int j = i;
              while ( j != 0 && s[i].positionX != s[i-1].positionX ) --j;
              if ( j != 0 ) {
                   s[i].positionY = s[i-1].positionY; 
                   break; 
              }
        }
        
        for(int i=0;i
        将您发布的代码放在自己的函数中,并在作业后将其返回。

        将您发布的代码放在自己的函数中,并在作业后将其返回。

        while语句(例如while x!=y)能解决您的问题吗?break;能解决问题吗?我已经试过了