Aquí hay una muestra simplificada. Básicamente, verifica una cadena de una lista de cadenas. Si la verificación pasa, eliminará esa cadena ( filterStringOut(i);), y ya no es necesario continuar ninguna otra verificación. Así continuea la siguiente cadena.
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; */
}
}
}
}
¿Cómo se debe continuar el bucle externo desde el interior de un bucle anidado?
Mi mejor conjetura es usar gotoy colocar una etiqueta al final del bucle externo. Eso me llevó a hacer esta pregunta, dado lo tabú que gotopuede ser.
En el chat c ++ IRC, se sugirió que coloque los forbucles en las funciones bool, que devuelven verdadero si se pasa un cheque. así
if ( containsExclude(s)) continue;
if (!containsInclude(s)) continue;
o que simplemente creo un booleano local, lo configuro en verdadero break, verifico bool y continúo si es verdadero.
Dado que estoy usando esto en un analizador, realmente necesito priorizar el rendimiento en este ejemplo. ¿Es esta una situación en la gotoque todavía es útil, o es un caso en el que necesito reestructurar mi código?
goto, a pesar de su mala reputación. No temas a los nombres, teme a los conceptos.