Выход из вложенных циклов в C ++

0

Скажем, у нас есть следующий код, и когда мы прерываем, мы хотим вырваться из внутреннего и внешнего циклов вместо внутреннего цикла и перейти непосредственно к blablabla. Как мы можем это сделать в C++?

for (int i = 0; i < m; i++) {
    for (int j = 0; j < n; j++) {
         if (some condition) {
             // Do something and break...
             break; // Breaks out of the inner loop
         }
    }
}

blablabla
...
  • 3
    Мой еретик ответ будет Гото . Теперь возьми свои факелы и вилки и убей меня ;-)
  • 0
    Не могли бы вы привести более конкретный пример? Я никогда не видел случая, чтобы вы хотели разорвать несколько циклов, по крайней мере, не в правильно написанном коде. Большинство примеров, которые я видел, являются результатом попытки сделать слишком много в одной функции.
Теги:
for-loop

7 ответов

3

"Идите прямо к [...]" звучит как идеальная работа для goto. И это !

for (int i = 0; i < m; i++) {
    for (int j = 0; j < n; j++) {
         if (some condition) {
             // Do something and break...
             goto afterLoop; // Breaks out of both loops
         }
    }
}
afterLoop:
// More stuff
  • 2
    Зачем нам добавлять ненужные ветви и сложные условия цикла, когда у нас есть инструмент, который делает именно то, что нам нужно, с минимальной работой? Это оптимальный способ сделать это. Это эффективно, и цель и выполнение кода понятны.
  • 1
    @Serge все , что здравый смысл не будет сдерживать все goto недоброжелателей «s. Догмы.
1

Существует два способа его решения:

Решение 1: используйте логическое подтверждение вместо второго цикла

for (int i = 0; i < m; i++) {
int j = 0;
bool conditionOut=false;
    while (!conditionOut && j<n)
    {
       if (some condition)
       {
          conditionOut =true;
          break;
       }
    }
}

Решение 2: используйте goto (Stroustrup упоминает его как единственное из немногих примеров, где goto полезен в C++)

0

Вы можете извлечь циклы в отдельную функцию и использовать return.

void doTheLoop(int n, int m) {
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
             if (some condition) {
                 // Do something and break...
                 return;
             }
        }
    }
}

doTheLoop(n, m);
//blablabla ...
0

Например

for ( int i = 0; i < m; i++ ) 
{
    bool exit = false;

    for ( int j = 0; !exit && j < n; j++ ) 
    {
         if ( ( exit = some condition ) ) 
         {
             // Do something and break...
         }
    }

    if ( exit ) break;
}

Или

bool exit = false;

for ( int i = 0; !exit && i < m; i++ ) 
{
    for ( int j = 0; !exit && j < n; j++ ) 
    {
         if ( ( exit = some condition ) ) 
         {
             // Do something and break...
         }
    }
}
0

Вы можете построить переменную проверку во внешнем цикле, скажем:

bool end;

Во внутреннем цикле, в какой-то момент, вы хотите вырваться и установить конец в true. Вам также нужно условие if.

0

Используйте другую переменную int.

for (int i = 0, Out = 0; i < m && Out == 0; i++) {
    for (int j = 0; j < n && Out == 0; j++) {
         if (some condition) {
             Out = 1;
         }
    }
}
0

Вы можете использовать "goto" для этих целей.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню