Đây là một mẫu đơn giản hóa. Về cơ bản, nó kiểm tra một chuỗi từ danh sách chuỗi. Nếu kiểm tra vượt qua, nó sẽ xóa chuỗi đó ( filterStringOut(i);
) và không còn cần thiết để tiếp tục bất kỳ kiểm tra nào khác. Do đó, continue
để chuỗi tiếp theo.
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; */
}
}
}
}
Làm thế nào để người ta tiếp tục vòng lặp bên ngoài từ bên trong một vòng lặp lồng nhau?
Dự đoán tốt nhất của tôi là sử dụng goto
và đặt một nhãn ở cuối vòng ngoài. Điều đó thôi thúc tôi đặt câu hỏi này, đưa ra cách cấm kỵ goto
.
Trong trò chuyện IRC c ++, có ý kiến cho rằng tôi đặt các for
vòng lặp trong các hàm bool, nó trả về giá trị true nếu kiểm tra được thông qua. do đó
if ( containsExclude(s)) continue;
if (!containsInclude(s)) continue;
hoặc đơn giản là tôi tạo một boolean cục bộ, đặt nó thành true break
, kiểm tra bool và tiếp tục nếu đúng.
Cho rằng tôi đang sử dụng điều này trong một trình phân tích cú pháp, tôi thực sự cần phải ưu tiên hiệu suất trong ví dụ này. Đây có phải là một tình huống goto
vẫn còn hữu ích hay là một trường hợp tôi cần cơ cấu lại mã của mình?
goto
, mặc dù tiếng xấu của nó. Đừng sợ tên - khái niệm sợ hãi.