Esistono diversi metodi a seconda di cosa devi fare.
1. Il metodo più semplice si ha quando i due cicli sono alla fine del corpo di una funzione. In tal caso è sufficiente inserire un return. Questo metodo non è molto generico, ma è senza dubbio il più semplice e leggibile e se i due cicli sono abbastanza grossi potrebbe comunque essere una buona idea quella di farne una funzione separata.
2. Il secondo metodo fa uso di goto. Questa istruzione può portare ad un codice molto difficile da comprendere, ma se limitato a situazioni eccezionali come questa può essere utile per rendere il codice più leggibile.
- Codice:
for (..) {
// ...
for (..) {
// ...
if (..) { goto esci_cicli; }
// ...
}
// ...
}
esci_cicli:
// ...
L'istruzione goto permette di saltare da un punto ad un altro del codice. L'esecuzione salta infatti alla prima istruzione che segue l'etichetta dopo il goto. Una etichetta viene definita semplicemente scrivendo il nome seguito dai due punti. Puoi usare qualsiasi nome. Questa soluzione ha alcuni potenziali problemi legati alla gestione della memoria. Si tratta infatti di una diretta traduzione di una istruzione del compilatore e alcune funzionalità più avanzate del C++ potrebbero non funzionare correttamente quando viene usata. Se nel ciclo non fai nulla di particolare non dovrebbero esserci problemi. Una sua evoluzione è presente nel punto 4.
3. Puoi usare una variabile booleana come segue:
- Codice:
bool esci_cicli = false;
for (..) {
// ...
for (..) {
// ...
if (..) { esci_cicli = true; break; }
// ...
}
if (esci_cicli) { break; }
// ...
}
Questa è anche la soluzione proposta dagli altri.
4. Puoi usare una eccezione. Questa soluzione è principalmente utile in situazioni in cui ci sono più cicli o vuoi uscire da una lunga sequenza di funzioni ricorsive. Si tratta di un abuso di questa funzionalità ed è in generale sconsigliata per casi come questo (è anche probabilmente la soluzione meno efficiente).
- Codice:
try {
for (..) {
// ...
for (..) {
// ...
if (..) { throw std::exception(); }
// ...
}
// ...
}
} catch (const std::exception &e) { }
// ...
Ignora questa soluzione nel tuo particolare caso.