2013-10-14 4 views
1

Я хочу, чтобы обе петли останавливались, как только я нахожу объект, который имеет ту же позицию в x.Как остановить вложенный цикл for

Вот мой 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; он ломает только из внутренней цикл. Каков наилучший способ остановить оба?

Опции:

  1. Установить индексы петель до величины максимального (или минимального значения), чтобы завершить петлю.
  2. Поместите все это внутри функции и используйте возврат.
  3. Используйте Гото
  4. Используйте Lambda
  5. Установите булево стоп-код к подлинному, перерыв, а затем слушать перерыв и выйти из другого цикла?
  6. ?
+1

будет оператором while (например, в то время как x! = Y) решить вашу проблему? – nycdan

+1

break; может исправить проблему –

+0

Я уже пробовал перерыв в инструкции if, но это не сработало. – user2775084

ответ

2

Я предполагаю, что вы просите остановить цикл for. Ключевое слово, которое вы ищете, - break. Тем не менее, если вы хотите, чтобы выйти как for петли, вам необходимо добавить переменную в вашей code.-

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; 
    } 
} 
4

Чтобы вырваться из внутреннего for цикла, используйте break.

Чтобы вырваться из самого дальнего, используйте goto или используйте комбинацию из break и флаг «should stop».

+1

Не использовать goto: http://stackoverflow.com/questions/46586/goto-still -рассмотренный-вредный –

+0

Дебаты «goto» - это полурелигиозное минное поле; Я не буду подвергать цензуре свой ответ только ради «Одного правильного пути». ОП может сам решить, какой вариант он предпочитает: оба присутствуют. –

1

Вы можете остановить цикл for с помощью break.

С вложенными петлями for все не так просто. Вы можете достичь своей цели

  • либо с установкой флага (done = 1; и использовать его с for(int j = i; j > 0 && !done; --j))
  • или goto. Хотя goto нахмурился некоторыми людьми, он может, если использовать правильно и с осторожностью, быть законным решением для некоторых проблем, таких как обработка ошибок или вообще «законченная обработка».
3

Я хотел бы предложить лямбда:

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 в этом случае, но техника кажется чистой, по крайней мере для меня. Кроме того, как только у вас есть лямбда с , имя (a хорошее имя), вы можете использовать его несколько раз, если вам нужно —, поэтому этот метод повышает читаемость кода и поощряет повторное использование кода.

Конечно, если вам не нужно называть это несколько раз, то, вероятно, вам не нужно имя. Вы просто могли бы сделать это:

[&] 
{ 
    //your code with the added return statement. 
}(); 

Но, как я сказал, name увеличивает читаемость, даже если вы не вызываете его несколько раз.


Если вы не можете использовать лямбда по какой-то причине, то еще можно было избежать использования дополнительной переменной, такой как 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; 
     } 
    } 
} 

Надежда что помогает.

+0

Пока вы предлагаете альтернативы 'break', как насчет throw/catch (* утки *). (+1) – bitmask

+0

Но 'return;' который точно соответствует той же цели, что и 'break' и' goto'. – glglgl

+0

На самом деле ему даже не нужно его хранить. ('([]() {})()') - То есть, предполагая, что он только хочет называть его один раз. –

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; 
     } 
} 
2

Поместите код размещен в своей собственной функции и return из него после выполнения задания.

+0

+1. Именно то, что лямбда могла сделать легко. – Nawaz

Смежные вопросы