Czy można użyć tej break
funkcji, aby wyjść z kilku zagnieżdżonych for
pętli?
Jeśli tak, jak byś to zrobił? Czy możesz również kontrolować, ile pętli break
wychodzi?
c++
for-loop
break
nested-loops
Faken
źródło
źródło
Odpowiedzi:
AFAIK, C ++ nie obsługuje pętli nazewnictwa, podobnie jak Java i inne języki. Możesz użyć goto lub utworzyć używaną wartość flagi. Na końcu każdej pętli sprawdź wartość flagi. Jeśli jest ustawiony na true, możesz przerwać tę iterację.
źródło
goto
jeśli jest to najlepsza opcja.goto
: złych programistów i programistów pragmatycznych. Te pierwsze są oczywiste. Ten ostatni, do którego pasowałbyś, gdybyś zdecydował się je dobrze wykorzystać, stosuje tak zwaną koncepcję „zła”, gdy jest to mniejsze (dwa) zło. Przeczytaj to, aby lepiej zrozumieć niektóre koncepcje języka C ++, które mogą być potrzebne od czasu do czasu (makra, goto's, preprocesor, tablice): parashift.com/c++-faq-lite/big-picture.html#faq-6.15goto
rzadko jest najlepszą opcją. Dlaczego nie zastosować pętli do ich własnej funkcji (inline
jeśli martwisz się szybkością) ireturn
od tego?Nie, nie psuj tego za pomocą
break
. To ostatnia zachowana warownia do użytkugoto
.źródło
Aby dodać jednoznaczną odpowiedź za pomocą lambdas:
Oczywiście ten wzorzec ma pewne ograniczenia i oczywiście tylko C ++ 11, ale myślę, że jest całkiem użyteczny.
źródło
Innym podejściem do wyrwania się z zagnieżdżonej pętli jest podzielenie obu pętli na osobną funkcję i
return
od tej funkcji, gdy chcesz wyjść.Oczywiście rodzi to kolejny argument, czy należy kiedykolwiek jawnie odwoływać się
return
do funkcji w dowolnym miejscu innym niż na końcu.źródło
continue_processing
), które kontrolowały wykonywanie bloków kodu w dalszej części funkcji.break wyjdzie tylko z najbardziej wewnętrznej pętli ją zawierającej.
Możesz użyć goto, aby wyjść z dowolnej liczby pętli.
Oczywiście goto jest często uważane za szkodliwe .
Korzystanie z break i goto może utrudnić wnioskowanie o poprawności programu. Zobacz tutaj dyskusję na ten temat: Dijkstra nie była szalona .
źródło
break
lubreturn
.break
ireturn
mają tę przewagęgoto
, że nie musisz szukać etykiety, aby znaleźć kierunek . Tak, pod nimi są jakieśgoto
, ale bardzo ograniczone. Są one o wiele łatwiejsze do rozszyfrowania przez mózg dopasowujący wzorce programisty niż nieograniczonygoto
. Więc IMO są lepsze.goto
.Chociaż ten answear został już zaprezentowany, myślę, że dobrym podejściem jest wykonanie następujących czynności:
źródło
gotoMainLoop
jest sprawdzany co cyklgoto
czyni rdzeń bardziej czytelnym i wydajniejszym.Co powiesz na to?
źródło
Przykład kodu używającego
goto
i etykiety do wyrwania się z zagnieżdżonej pętli:źródło
Jednym z dobrych sposobów na wyrwanie się z kilku zagnieżdżonych pętli jest przefaktoryzowanie kodu na funkcję:
źródło
goto może być bardzo pomocny w zrywaniu zagnieżdżonych pętli
źródło
z msdn .
źródło
Myślę, że a
goto
jest ważne w takich okolicznościach:Aby symulować
break
/continue
, chcesz:Złamać
Kontyntynuj
źródło
i
. Stądi++
przed gotoInne języki, takie jak PHP, akceptują parametr break (tj. Break 2;), aby określić liczbę poziomów zagnieżdżonych pętli, z których chcesz się zerwać, C ++ jednak tego nie robi. Będziesz musiał to wypracować, używając logicznej wartości, którą ustawiłeś na false przed pętlą, ustaw na true w pętli, jeśli chcesz przerwać, oraz warunkową przerwę po zagnieżdżonej pętli, sprawdzając, czy logiczna została ustawiona na true i złamać, jeśli tak.
źródło
Wiem, że to stary post. Sugerowałbym jednak nieco logiczną i prostszą odpowiedź.
źródło
j = conditionj
nie zadziała, jeśli zamiast tego masz złożony predykatj < conditionj
.Przerwij dowolną liczbę pętli za pomocą tylko jednej
bool
zmiennej, patrz poniżej:W tym kodzie mamy
break;
wszystkie pętle.źródło
Nie jestem pewien, czy warto, ale możesz emulować nazwane pętle Java za pomocą kilku prostych makr:
Przykładowe użycie:
Inny przykład:
źródło
źródło
Możesz użyć try ... catch.
Jeśli musisz wyrwać się z kilku pętli jednocześnie, często jest to i tak wyjątek.
źródło
Wyłamanie się z pętli for jest dla mnie trochę dziwne, ponieważ semantyka pętli for zwykle wskazuje, że wykona ona określoną liczbę razy. Jednak nie jest to złe we wszystkich przypadkach; jeśli szukasz czegoś w kolekcji i chcesz się zepsuć po jego znalezieniu, jest to przydatne. Przełamywanie zagnieżdżonych pętli nie jest jednak możliwe w C ++; jest w innych językach poprzez użycie przerwy oznaczonej etykietą. Możesz użyć etykiety i goto, ale może to spowodować zgagę w nocy ..? Wydaje się jednak najlepszą opcją.
źródło