У меня были некоторые проблемы с практическим собеседованием, и я столкнулся со сценарием, в котором проще всего использовать goto (выход за пределы только внутреннего вложенного цикла). На собеседовании или на рабочем месте я должен просто пойти с версией non goto, чтобы избежать запрещенного ключевого слова, или это нормально, когда goto значительно помогает.
Пример:
for (int i = 0; i < haystack.size() - needle.size() + 1; i++) {
if (haystack[i] == needle[0]) {
for (int j = 1; j < needle.size(); j++) {
if (haystack[i+j] != needle[j]) {
goto main_loop;
}
}
return i;
}
main_loop: ;
}
против
for (int i = 0; i < haystack.size() - needle.size() + 1; i++) {
if (haystack[i] == needle[0]) {
bool valid = true;
for (int j = 1; j < needle.size(); j++) {
if (haystack[i+j] != needle[j]) {
valid = false;
}
}
if (valid) {
return i;
}
}
}
Есть несколько случаев, когда вам нужно перейти, например:
Выпадение из гнездовых петель:
while (some_condition)
while(some_another_condition)
if (this_condition_is_false)
goto out;
out:
который может быть что-то вроде:
while (some_condition && !this_condition_is_false)
while (some_another_condition)
if (this_condition_is_false)
break;
Итак, есть прежде всего нет причин даже использовать goto
больше, кроме уменьшения незаметности прерывания вложенных циклов … и возможности циклов C ++ заставляют его чувствовать себя устаревшим …
Других решений пока нет …