Aqui está uma amostra simplificada. Basicamente, ele verifica uma string de uma lista de strings. Se a verificação for aprovada, ela removerá a string ( filterStringOut(i);
) e não será mais necessário continuar com outras verificações. Assim, continue
para a próxima string.
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; */
}
}
}
}
Como se deve continuar o loop externo de dentro de um loop aninhado?
Meu melhor palpite é usar goto
e colocar um rótulo no final do loop externo. Isso me levou a fazer essa pergunta, dado o quão tabu goto
pode ser.
No bate-papo do c ++ IRC, foi sugerido que eu coloque os for
loops nas funções bool, que retornam true se uma verificação for aprovada. portanto
if ( containsExclude(s)) continue;
if (!containsInclude(s)) continue;
ou simplesmente crie um booleano local, defina-o como true break
, verifique bool e continue se true.
Como estou usando isso em um analisador, na verdade, preciso priorizar o desempenho neste exemplo. É uma situação em que goto
ainda é útil ou é necessário reestruturar meu código?
goto
, apesar de sua má reputação. Não tema nomes - tema conceitos.