如何摆脱嵌套循环?
如果我使用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
最后的有效使用:)
如果不是这样,那么你可以使用标志突破深嵌套循环。
另一种解决嵌套循环的方法是将两个循环分解为一个单独的函数,并在退出时从该函数返回。
总结 – 打破嵌套循环:
- 使用
goto
- 使用标志
- 将因循环分解为单独的函数调用
无法拒绝不包括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; }