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


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

17   247  

17 ответов:

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

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

return от этой функции, когда вы хотите выйти.

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

просто добавить явный ответ с помощью лямбд:

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

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

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

можно использовать перейти выйти из любого количества петель.

конечно перейти часто Считаются Вредными.

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

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

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

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

}

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

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

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

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

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

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

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

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

С msdn.

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

для имитации break/continue ты хочешь:

перерыв

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

дальше

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

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

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

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

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

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

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

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

    if (shouldBreakOuter == true)
      break;

  }

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