如何停止嵌套的 for 循环

How to stop a nested for loop

本文关键字:for 循环 嵌套 何停止      更新时间:2023-10-16

我希望一旦我找到在 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; 
        }
    }
}

如果我使用break;它只会从内部 for 循环中突破。 阻止两者的最佳方法是什么?

选项:

  1. 将循环的索引设置为最大值(或最小值)以终止循环。
  2. 将所有这些放在一个函数中并使用 return。
  3. 使用转到
  4. 使用λ
  5. 将布尔停止代码设置为 true,break 然后侦听 break 并脱离其他循环?

要突破最内层的for循环,请使用 break

要突破最外层的标志,请使用goto或使用break和"应该停止"标志的组合。

我会建议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!

没有break,没有goto。 :-)

在这种情况下,它与breakgoto具有相同的目的,但该技术似乎很干净,至少对我来说是这样。此外,一旦你有了带有名称(一个名字)的lambda,如果需要,你可以多次使用它——所以这种技术提高了代码的可读性并鼓励代码重用。

当然,如果你不需要多次调用它,那么你可能不需要名字。你可以这样做:

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

但正如我所说,即使您不多次调用它,name也会提高可读性。


如果您由于某种原因无法使用lambda,那么您仍然可以避免使用额外的变量,例如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;
        }
    }
}

希望有帮助。

我猜你要求停止for循环。您正在寻找的关键字是中断。但是,如果要退出两个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;
    }
}

将你发布的代码放在它自己的函数中,并在分配后return出来。

您可以使用 break 停止for循环。

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

  • 要么设置标志(done = 1;并与for(int j = i; j > 0 && !done; --j)一起使用)
  • 或与goto.尽管有些人不赞成goto,但如果正确和谨慎地使用,它可以成为某些问题的合法解决方案,例如错误处理,或者一般来说,"完成处理"。

尝试以下操作

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