É possível usar a break
função para sair de vários for
loops aninhados ?
Se sim, como você faria isso? Você também pode controlar quantos ciclos as break
saídas?
c++
for-loop
break
nested-loops
Faken
fonte
fonte
Respostas:
AFAIK, C ++ não suporta loops de nomeação, como Java e outras linguagens. Você pode usar um goto ou criar um valor de sinalizador usado. No final de cada loop, verifique o valor do sinalizador. Se estiver definido como true, você poderá interromper essa iteração.
fonte
goto
se essa for a melhor opção.goto
: programadores ruins e programadores pragmáticos. Os primeiros são auto-explicativos. O último, no qual você se encaixaria se optar por usá-los bem, usa o chamado conceito de "mal" quando é o menor dos (dois) males. Leia isso para entender melhor alguns conceitos de C ++ que você pode precisar usar de tempos em tempos (macros, goto's, pré-processador, matrizes): parashift.com/c++-faq-lite/big-picture.html#faq-6.15goto
raramente é a melhor opção. Por que não colocar os loops em sua própria função (inline
se você está preocupado com a velocidade) ereturn
com isso?Não, não estrague tudo com um
break
. Esta é a última fortaleza restante para o uso degoto
.fonte
Apenas para adicionar uma resposta explícita usando lambdas:
Claro que esse padrão tem certas limitações e, obviamente, apenas C ++ 11, mas acho que é bastante útil.
fonte
Outra abordagem para interromper um loop aninhado é fatorar os dois loops em uma função separada e a
return
partir dessa função quando você deseja sair.Obviamente, isso traz outro argumento sobre se você deve explicitamente alguma vez
return
de uma função em outro lugar que não seja o final.fonte
continue_processing
) que controlavam a execução de blocos de código mais abaixo na função.break sairá apenas do loop mais interno que o contém.
Você pode usar o goto para interromper qualquer número de loops.
É claro que o goto é frequentemente considerado nocivo .
Usar break e goto pode dificultar o raciocínio sobre a correção de um programa. Veja aqui uma discussão sobre isso: Dijkstra não era louco .
fonte
break
oureturn
.break
ereturn
tenha a vantagem degoto
não precisar procurar um rótulo para descobrir para onde ele vai. Sim, por baixo eles são algum tipogoto
, mas muito restrito. Eles são muito mais fáceis de decifrar pelo cérebro de correspondência de padrões de um programador do que pelo irrestritogoto
. Então IMO são preferíveis.goto
.Embora essa resposta já tenha sido apresentada, acho que uma boa abordagem é fazer o seguinte:
fonte
gotoMainLoop
é verificado a cada ciclo #goto
torna o núcleo mais legível e com melhor desempenho.Que tal agora?
fonte
Um exemplo de código usando
goto
e um rótulo para interromper um loop aninhado:fonte
Uma boa maneira de interromper vários loops aninhados é refatorar seu código em uma função:
fonte
Goto pode ser muito útil para quebrar loops aninhados
fonte
do msdn .
fonte
Eu acho que a
goto
é válido nesta circunstância:Para simular um
break
/continue
, você deseja:Pausa
Continuar
fonte
i
. Por isso,i++
antes do gotoOutras linguagens como o PHP aceitam um parâmetro para break (isto é, break 2;) para especificar a quantidade de níveis de loop aninhados dos quais você deseja interromper, o C ++, no entanto, não. Você precisará resolver isso usando um booleano que você definiu como false antes do loop, definido como true no loop, se você deseja interromper, além de uma quebra condicional após o loop aninhado, verificando se o booleano foi definido como true e quebre se sim.
fonte
Eu sei que este é um post antigo. Mas eu sugeriria uma resposta um pouco lógica e mais simples.
fonte
j = conditionj
não funcionará se você tiver um predicado complexo em vez dej < conditionj
.Quebre qualquer número de loops por apenas uma
bool
variável, veja abaixo:Neste código,
break;
todos os loops.fonte
Não tenho certeza se vale a pena, mas você pode emular os loops nomeados do Java com algumas macros simples:
Exemplo de uso:
Outro exemplo:
fonte
fonte
Você pode usar try ... catch.
Se você precisar interromper vários loops de uma só vez, geralmente é uma exceção.
fonte
Quebrar um loop for é um pouco estranho para mim, uma vez que a semântica de um loop for indica que ele executará um número especificado de vezes. No entanto, não é ruim em todos os casos; se você estiver procurando por algo em uma coleção e quiser quebrar depois de encontrá-lo, é útil. A quebra de loops aninhados, no entanto, não é possível em C ++; está em outros idiomas através do uso de uma quebra rotulada. Você pode usar um rótulo e ir embora, mas isso pode causar azia à noite ..? Parece ser a melhor opção.
fonte