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í continue
a 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 goto
y colocar una etiqueta al final del bucle externo. Eso me llevó a hacer esta pregunta, dado lo tabú que goto
puede ser.
En el chat c ++ IRC, se sugirió que coloque los for
bucles 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 goto
que 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.