1

一旦我找到一个在 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. 使用 goto
  4. 使用 Lambda
  5. 将布尔停止代码设置为 true,break,然后监听 break 并跳出其他循环?
  6. ?
4

6 回答 6

4

要跳出最里面的for循环,请使用break.

要突破最外层,可以使用goto或组合使用break和 一个“应该停止”标志。

于 2013-10-14T15:46:30.957 回答
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。:-)

在这种情况下,它的用途与break和相同goto,但该技术似乎很干净,至少对我而言。此外,一旦你有了一个名字(一个名字)的 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;
        }
    }
}

希望有帮助。

于 2013-10-14T15:49:20.817 回答
2

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

于 2013-10-14T15:56:06.720 回答
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

尝试以下

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; 
      }
}
于 2013-10-14T15:53:02.657 回答
1

您可以使用 停止for循环break

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

  • 要么设置一个标志(done = 1;并使用它for(int j = i; j > 0 && !done; --j)
  • 或与goto. 尽管goto有些人不赞成,但如果正确使用并小心使用,它可以成为某些问题的合法解决方案,例如错误处理,或者一般来说,“完成处理”。
于 2013-10-14T15:47:17.353 回答