如何停止嵌套的 for 循环
How to stop a nested 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 循环中突破。 阻止两者的最佳方法是什么?
选项:
- 将循环的索引设置为最大值(或最小值)以终止循环。
- 将所有这些放在一个函数中并使用 return。
- 使用转到
- 使用λ
- 将布尔停止代码设置为 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
。 :-)
在这种情况下,它与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;
}
}
}
希望有帮助。
我猜你要求停止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;
}
}
相关文章:
- 如何在C++中从两个单独的for循环中添加两个数组
- 为什么我的for循环不能正确获取argv
- 在基于范围的for循环中使用结构化绑定声明
- 通过for循环使用用户输入填充列表
- 使用for循环检查数组中的重复项
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 正在使用for循环创建QScatterSerie
- Python中的for循环与C++有何不同
- 在更改for循环的第三部分后,未使用for循环结果
- 在 for 循环中查找问题时遇到困难
- 嵌套for循环C++的问题(初学者)
- 如何用for循环在c++中生成单词三角形
- 如何在for循环中包含两个索引值的测试条件
- 带有多个独立参数的C++For循环
- 为什么我的程序在for循环中k=0时返回垃圾值
- 如何通过替换顺序代码的while循环来添加OpenMP for循环
- C++-For循环未执行
- 基于范围的 for 循环:迭代使用一个元素扩展的向量
- C++ 无法在字符数组中使用 for 循环打印字母模式