Могу ли я использовать break для выхода из нескольких вложенных циклов?

Можно ли использовать функцию break для выхода из нескольких вложенных циклов for? Если да, как бы вы это сделали? Можете ли вы также контролировать, сколько циклов выходит из строя?

Ответы

Ответ 1

AFAIK, С++ не поддерживает циклы именования, такие как Java и другие языки. Вы можете использовать goto или создать значение флага, которое вы используете. В конце каждого цикла проверьте значение флага. Если для него установлено значение true, вы можете выйти из этой итерации.

Ответ 2

Нет, не портите его break. Это последний оставшийся опорный пункт для использования goto.

Ответ 3

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

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

Ответ 4

Просто для добавления явного ответа с помощью lambdas:

  for (int i = 0; i < n1; ++i) {
    [&] {
      for (int j = 0; j < n2; ++j) {
        for (int k = 0; k < n3; ++k) {
          return; // yay we're breaking out of 2 loops here
        }
      }
    }();
  }

Конечно, эта модель имеет определенные ограничения и, очевидно, только С++ 11, но я думаю, что это очень полезно.

Ответ 5

break будет выходить только из самого внутреннего цикла, содержащего его.

Вы можете использовать goto, чтобы выйти из любого числа циклов.

Конечно, Гото часто считается вредным.

уместно ли использовать функцию прерывания [...]?

Использование break и goto может усложнить рассуждения о правильности программы. Смотрите здесь для обсуждения этого: Дейкстра не была безумной.

Ответ 6

Хотя этот ответ уже представлен, я считаю, что хороший подход заключается в следующем:

for(unsigned int z = 0; z < z_max; z++)
{
    bool gotoMainLoop = false;
    for(unsigned int y = 0; y < y_max && !gotoMainLoop; y++)
    {
        for(unsigned int x = 0; x < x_max && !gotoMainLoop; x++)
        {
                          //do your stuff
                          if(condition)
                            gotoMainLoop = true;
        }
    }

}

Ответ 7

Как насчет этого?

for(unsigned int i=0; i < 50; i++)
{
    for(unsigned int j=0; j < 50; j++)
    {
        for(unsigned int k=0; k < 50; k++)
        {
            //Some statement
            if (condition)
            {
                j=50;
                k=50;
            }
        }
    }
}

Ответ 8

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

for (;;)
  for (;;)
    goto theEnd;
theEnd:

Ответ 9

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

void foo()
{
    for(unsigned int i=0; i < 50; i++)
    {
        for(unsigned int j=0; j < 50; j++)
        {
            for(unsigned int k=0; k < 50; k++)
            {
                // If condition is true
                return;
            }
        }
    }
}

Ответ 10

goto может быть очень полезно для взлома вложенных циклов

for (i = 0; i < 1000; i++) {
    for (j = 0; j < 1000; j++) {
        for (k = 0; k < 1000; k++) {
             for (l = 0; l < 1000; l++){
                ....
                if (condition)
                    goto break_me_here;
                ....
            }
        }
    }
}

break_me_here:
// Statements to be executed after code breaks at if condition

Ответ 11

Оператор break завершает выполнение ближайшего закрывающего оператора do, for, switch или while, в котором он появляется. Элемент управления переходит к оператору, который следует за завершенным оператором.

из msdn.

Ответ 12

Я действительно думаю, что goto действительно в этом случае:

Чтобы имитировать a break/continue, вам нужно:

Разрыв

for ( ;  ;  ) {
    for ( ;  ;  ) {
        /*Code here*/
        if (condition) {
            goto theEnd;
        }
    }
}
theEnd:

Продолжить

for ( ;  ; ) {
    for ( ;  ;  ) {
        /*Code here*/
        if (condition) {
            i++;
            goto multiCont;
        }
    }
    multiCont:
}

Ответ 13

Другие языки, такие как PHP, принимают параметр break (т.е. break 2;), чтобы указать количество уровней вложенных циклов, из которых вы хотите вырваться, однако С++ этого не делает. Вам нужно будет его обработать, используя логическое значение, которое вы установили в значение false до цикла, установите true в цикле, если вы хотите сломать, плюс условный разрыв после вложенного цикла, проверяя, было ли значение boolean равным true и сломайте, если да.

Ответ 14

Я знаю, что это старый пост. Но я бы предложил немного логичный и более простой ответ.

for(unsigned int i=0; i < 50; i++)
    {
        for(unsigned int j=0; j < conditionj; j++)
        {
            for(unsigned int k=0; k< conditionk ; k++)
            {
                // If condition is true

                j= conditionj;
               break;
            }
        }
    }

Ответ 15

Разбейте любое количество циклов только одной переменной bool см. Ниже:

bool check = true;

for (unsigned int i = 0; i < 50; i++)
{
    for (unsigned int j = 0; j < 50; j++)
    {
        for (unsigned int k = 0; k < 50; k++)
        {
            //Some statement
            if (condition)
            {
                check = false;
                break;
            }
        }
        if (!check)
        {
            break;
        }
    }
    if (!check)
    {
        break;
    }
}

В этом коде мы break; все циклы.

Ответ 16

  while (i<n) {
    bool shouldBreakOuter = false;
    for (int j=i + 1; j<n; ++j) {
      if (someCondition) {
          shouldBreakOuter = true;
      }
    }

    if (shouldBreakOuter == true)
      break;

  }

Ответ 17

Вы можете использовать try... catch.

try {
    for(int i=0; i<10; ++i) {
        for(int j=0; j<10; ++j) {
            if(i*j == 42)
                throw 0; // this is something like "break 2"
        }
    }
}
catch(int e) {} // just do nothing
// just continue with other code

Если вам приходится выходить из нескольких циклов одновременно, это часто является исключением.

Ответ 18

Вывод из цикла for для меня немного странный, поскольку семантика цикла for обычно указывает, что он будет выполнять определенное количество раз. Однако это неплохо во всех случаях; если вы ищете что-то в коллекции и хотите сломаться после того, как найдете ее, это полезно. Однако исключение из вложенных циклов невозможно в С++; это на других языках посредством использования помеченного перерыва. Вы можете использовать ярлык и goto, но это может дать вам изжогу ночью...? Похоже, лучший вариант.