Berikut adalah contoh yang disederhanakan. Pada dasarnya, ia memeriksa string dari daftar string. Jika cek lolos, itu akan menghapus string itu ( filterStringOut(i);
), dan tidak perlu lagi melanjutkan pemeriksaan lainnya. Demikian continue
ke string selanjutnya.
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; */
}
}
}
}
Bagaimana seharusnya seseorang melanjutkan loop luar dari dalam loop bersarang?
Tebakan terbaik saya adalah menggunakan goto
dan menempatkan label di ujung lingkaran luar. Itu mendorong saya untuk mengajukan pertanyaan ini, mengingat bagaimana hal itu goto
bisa tabu .
Dalam obrolan c ++ IRC, disarankan agar saya menempatkan for
loop dalam fungsi bool, yang mengembalikan true jika tanda centang dilewati. jadi
if ( containsExclude(s)) continue;
if (!containsInclude(s)) continue;
atau bahwa saya cukup membuat boolean lokal, atur menjadi true break
, periksa bool dan lanjutkan jika benar.
Mengingat bahwa saya menggunakan ini dalam parser, saya sebenarnya perlu memprioritaskan kinerja dalam contoh ini. Apakah ini situasi di mana goto
masih berguna, atau ini merupakan kasus di mana saya perlu merestrukturisasi kode saya?
goto
, meskipun reputasinya buruk. Jangan takut nama - konsep ketakutan.