Подтвердить что ты не робот

Как вырваться из вложенных циклов?

Если я использую оператор 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
4b9b3361

Ответ 1

Как насчет:

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

Ответ 2

Нет, не портите веселье break. Это последнее действительное использование goto :)

Если нет, то вы можете использовать флаги для выхода из глубоких вложенных циклов.

Другой подход к разрыву вложенного цикла состоит в том, чтобы выделить оба цикла в отдельную функцию и вернуться из этой функции, когда вы хотите выйти.

Подведем итог - вырваться из вложенных циклов:

  1. использовать goto
  2. использовать флаги
  3. разложить циклы в отдельные вызовы функций

Не могу устоять, включая xkcd здесь :)

enter image description here

источник

Goto считаются вредными, но, как утверждают многие в комментариях, этого не должно быть. При разумном использовании это может быть отличным инструментом. Все, что используется в модерации, это весело.

Ответ 3

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

Ответ 4

Один из способов состоит в том, чтобы вставить все вложенные петли в функцию и вернуться из внутреннего большинства циклов из-за необходимости вырваться из всех циклов.

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

Ответ 5

Я думаю, что goto решит проблему

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

end:
stmt2 

Ответ 6

Вам понадобится логическая переменная, если вы хотите ее прочитать:

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

Если вы хотите, чтобы он был менее читаемым, вы можете присоединиться к логической оценке:

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

Ответ 8

Если вам нужны значения я и j, это должно работать но с меньшей производительностью, чем другие.

for(i;i< 1000; i++){    
    for(j; j< 1000; j++){
        if(condition)
            break;
    }
    if(condition) //the same condition
        break;
}

Ответ 9

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

end:

Ответ 10

Внимание: этот ответ показывает действительно неясную конструкцию.

Если вы используете GCC, просмотрите эту библиотеку. Как и в PHP, break может принимать количество вложенных циклов, которые вы хотите выполнить. Вы можете написать примерно следующее:

for(int i = 0; i < 1000; i++) {
   for(int j = 0; j < 1000; j++) {
       if(condition) {
            // break two nested enclosing loops
            break(2);
       }
   }
}

Ответ 11

int i = 0, j= 0;

for(i;i< 1000; i++){    
    for(j; j< 1000; j++){
        if(condition){
            i = j = 1001;
            break;
        }
    }
}

Разломит оба цикла.

Ответ 12

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);

Ответ 13

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

func(para1, para2...) {
    stmt2;
}