一旦找到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循环。阻止两者的最佳方法是什么?
选项:
答案 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
。 : - )
在这种情况下,它与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;
}
}
}
希望有所帮助。
答案 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;
}
}