Ecco un esempio semplificato. Fondamentalmente, controlla una stringa da una lista di stringhe. Se il controllo passa, rimuoverà quella stringa ( filterStringOut(i);
) e non sarà più necessario continuare altri controlli. Quindi continue
alla stringa successiva.
void ParsingTools::filterStrings(QStringList &sl)
{
/* Filter string list */
QString s;
for (int i=0; i<sl.length(); i++) {
s = sl.at(i);
// Improper length, remove
if (s.length() != m_Length) {
filterStringOut(i);
continue; // Once removed, can move on to the next string
}
// Lacks a substring, remove
for (int j=0; j<m_Include.length(); j++) {
if (!s.contains(m_Include.at(j))) {
filterStringOut(i);
/* break; and continue; */
}
}
// Contains a substring, remove
for (int j=0; j<m_Exclude.length(); j++) {
if (s.contains(m_Exclude.at(j))) {
filterStringOut(i);
/* break; and continue; */
}
}
}
}
Come si dovrebbe continuare il ciclo esterno da un ciclo annidato?
La mia ipotesi migliore è usare goto
e posizionare un'etichetta alla fine del ciclo esterno. Questo mi ha spinto a fare questa domanda, visto come può essere tabù goto
.
Nella chat IRC c ++, è stato suggerito di posizionare il for
loops nelle funzioni bool, che restituiscono true se è passato un controllo. quindi
if ( containsExclude(s)) continue;
if (!containsInclude(s)) continue;
o semplicemente creo un booleano locale, impostalo su true break
, controlla bool e continua se vero.
Dato che sto usando questo in un parser, in realtà ho bisogno di dare priorità alle prestazioni in questo esempio. È una situazione in cui goto
è ancora utile o è il caso in cui devo ristrutturare il mio codice?