如何摆脱嵌套循环?

如果我使用break语句,它只会打破内部循环,我需要使用一些标志来打破外部循环。 但是,如果有很多嵌套的循环,代码看起来不太好。

有没有其他的方式来打破所有的循环? (请不要使用goto stmt 。)

 for(int i = 0; i < 1000; i++) { for(int j = 0; j < 1000; j++) { if(condition) { // both of the loops need to break and control will go to stmt2 } } } stmt2 

关于什么:

 if(condition) { i = j = 1000;break; } 

不,不要破坏break的乐趣。 这是goto最后的有效使用:)

如果不是这样,那么你可以使用标志突破深嵌套循环。

另一种解决嵌套循环的方法是将两个循环分解为一个单独的函数,并在退出时从该函数返回。

总结 – 打破嵌套循环:

  1. 使用goto
  2. 使用标志
  3. 将因循环分解为单独的函数调用

无法拒绝不包括xkcd在这里:)

在这里输入图像说明

资源

后藤被认为是有害的,但许多人在评论中表示不需要。 如果明智地使用它可以是一个伟大的工具。 适度使用任何东西都很有趣。

 bool stop = false; for (int i = 0; (i < 1000) && !stop; i++) { for (int j = 0; (j < 1000) && !stop; j++) { if (condition) stop = true; } } 

一种方法是把所有的嵌套循环放入一个函数中,并从最内层的循环中返回一个需要跳出所有循环的内容。

 function() { for(int i=0; i<1000; i++) { for(int j=0; j<1000;j++) { if (condition) return; } } } 

我想goto将解决问题

 for(int i = 0; i < 1000; i++) { for(int j = 0; j < 1000; i++) { if (condition) { goto end; } } } end: stmt2 

你需要一个布尔variables,如果你想要它的可读性:

 bool broke = false; for(int i = 0; i < 1000; i++) { for(int j = 0; j < 1000; i++) { if (condition) { broke = true; break; } } if (broke) break; } 

如果你想让它不那么可读,你可以join布尔评估:

 bool broke = false; for(int i = 0; i < 1000 && !broke; i++) { for(int j = 0; j < 1000; i++) { if (condition) { broke = true; break; } } } 

作为一种最终的方法,你可以使初始循环无效:

 for(int i = 0; i < size; i++) { for(int j = 0; j < 1000; i++) { if (condition) { i = size; break; } } } 

使用LLVM团队的明智build议:

“把谓词循环变成谓词函数”

看到:

http://llvm.org/docs/CodingStandards.html#turn-predicate-loops-into-predicate-functions

如果你需要我和j的价值,这应该工作,但比其他人的performance较差

 for(i;i< 1000; i++){ for(j; j< 1000; j++){ if(condition) break; } if(condition) //the same condition break; } 
 for(int i = 0; i < 1000; i++) { for(int j = 0; j < 1000; i++) { if(condition) { goto end; } } end: 
 i = 0; do { for (int j = 0; j < 1000; j++) // by the way, your code uses i++ here! { if (condition) { break; } } ++i; } while ((i < 1000) && !condition); 
 int i = 0, j= 0; for(i;i< 1000; i++){ for(j; j< 1000; j++){ if(condition){ i = j = 1001; break; } } } 

将打破这两个循环。

 for(int i = 0; i < 1000; i++) { for(int j = 0; j < 1000; i++) { if(condition) { func(para1, para2...); return; } } } func(para1, para2...) { stmt2; }