Чтобы разорвать вложенный цикл

Я хочу прервать внутренний цикл и увеличить значение x, если я найду что-то в Matrix[x][y], но если я сломаю y for loop, оно просто увеличит значение y loop, а не x loop.

int matrix[5][5]; //let's assume there are values inside
for(int i = 0; i < 5; i++)
   {
     for(int j = 0; j<5;j++)
      {
        int radius = 1;
        for(int x = radius - 1; x <= radius + i; x ++)
         {
          for(int y = radius -1; y <= radius +j; y++)
            {
               if((x+i) >= 0 && (y+j)>=0)
                 {
      //for example I find the number 45 in the matrix, then the search radius should be increased by 1 and start it over again.
                  if(matrix[x][y] == 45)
                     {
                       radius++;
                       break; // but if i break here the x value wont be changed
                      }

                  }
             }
          }
      }

person Newuser1234567    schedule 15.03.2018    source источник
comment
используйте оператор goto   -  person DaBler    schedule 15.03.2018
comment
ты хочешь continue?   -  person king_nak    schedule 15.03.2018
comment
Вы можете использовать переменную для установки x, а затем увеличить ее на 1, когда найдете.   -  person Ryan Wilson    schedule 15.03.2018
comment
@ Newuser1234567 Почему вы решили, что x не будет увеличиваться после перерыва в этом операторе; // но если я сломаю здесь значение x, значение x не изменится?   -  person Vlad from Moscow    schedule 15.03.2018
comment
Вы можете изменить значение x перед break.   -  person Peter    schedule 15.03.2018
comment
Да, я хочу продолжить поиск (например, поиск пикселей изображения в openCv) и увеличить радиус, в котором я остановил его @king_nak   -  person Newuser1234567    schedule 15.03.2018
comment
Я бы использовал здесь goto. На самом деле нет другого способа вырвать частично из вложенного цикла без добавления кода проверки на уровень, на который вы хотите выйти. (Логические флаги, числовые проверки и т. Д.)   -  person Arnav Borborah    schedule 15.03.2018
comment
@VladfromMoscow Я написал программу с матрицей 10 x 10 и суммировал соседей и то, как идут x и y, и почему-то x не изменил только значение y   -  person Newuser1234567    schedule 15.03.2018
comment
Можете ли вы провести рефакторинг кода? Было бы проще, если бы ты мог где-нибудь воткнуть return.   -  person StoryTeller - Unslander Monica    schedule 15.03.2018
comment
Что происходит со значением j и i? Если вы увеличиваете радиус, он прерывает цикл «y», а затем проверка на «x», когда i = 0, приведет к завершению этого цикла. Если 'j' увеличивается, вы знаете, что это ваша проблема.   -  person HungryBeagle    schedule 15.03.2018
comment
также называется идиомой цикла: en.wikibooks.org/wiki/More_C%2B%2B_Idioms / Named_Loop   -  person DaBler    schedule 15.03.2018


Ответы (1)


Из нелокальных механизмов выхода C ++ предоставляет метание:

try {
    for(int x = 0; x < 10; ++x) {
        for(int y = 0; y < 3; ++y) {
            std::cout << x << ", " << y << std::endl;
            if(y == 1 && x == 3) throw true;
        }
    }
}
catch(bool) {}
std::cout << std::endl;

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

for(int x = 0; x < 10; ++x) {
    for(int y = 0; y < 3; ++y) {
        std::cout << x << ", " << y << std::endl;
        if(y == 1 && x == 3) {
            x = 10;
            break;
        }
    }
}
std::cout << std::endl;

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

bool continueOuter{true};
for(int x = 0; continueOuter && x < 10; ++x) {
    for(int y = 0; y < 3; ++y) {
        std::cout << x << ", " << y << std::endl;
        if(y == 1 && x == 3) {
            continueOuter = false;
            break;
        }
    }
}

)

person bipll    schedule 15.03.2018
comment
использование исключений было бы неуместным в этом случае. Необходимость увеличения радиуса поиска - не исключительное обстоятельство. Это ожидаемая часть алгоритма. - person Richard Hodges; 15.03.2018
comment
И где именно использовать исключения? - person bipll; 15.03.2018
comment
try / catch / throw включают исключения независимо от того, извлекаете ли вы фактический тип исключения из std :: exception. throw int(1) вызывает исключение типа int. - person Richard Hodges; 15.03.2018
comment
Не могли бы вы прояснить: бросая исключение, вы имеете в виду, что это на самом деле исключение из чего-то, или это разговорный термин для нелокального выхода? - person bipll; 15.03.2018
comment
см. [expr.throw] в стандартном черновике C ++: оценка выражения throw с операндом вызывает исключение (18.1); тип объекта исключения определяется путем удаления любых cv-квалификаторов верхнего уровня из статического типа операнда и изменения типа с «массив T» или типа функции T на «указатель на T» open-std.org/jtc1/sc22/wg21/docs/papers/ 2017 / n4659.pdf - person Richard Hodges; 15.03.2018