如何停止嵌套for循环

时间:2013-10-14 15:44:08

标签: c++ if-statement for-loop

一旦找到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. 使用Lambda
  5. 将布尔停止代码设置为true,break,然后监听中断并突破其他循环?

6 个答案:

答案 0 :(得分:4)

要突破最里面的for循环,请使用break

要突破最外面的一个,请使用goto或使用break和“应停止”标志的组合。

答案 1 :(得分:3)

我建议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;
        }
    }
}

希望有所帮助。

答案 2 :(得分: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;
    }
}

答案 3 :(得分:2)

将您发布的代码放在自己的函数中,并在分配后将return放在其中。

答案 4 :(得分:1)

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

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

  • 设置标记(done = 1;并将其与for(int j = i; j > 0 && !done; --j)一起使用)
  • goto。虽然goto对某些人不满意,但如果正确使用,它可以是一些合法的解决方案,例如错误处理,或者一般来说,“已完成处理”。

答案 5 :(得分:1)

尝试以下

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