Użycie przerwania return w C++

0

Czesc,

Mam pytanie czy w funkcji można użyć dwukrotnie przerwania pętli wyrażeniem "return" ? Tzn w przypadku wystąpienia danej wartości zwróć tą wartośc a jak nie to zwróć inną jak w kodzie poniżej

#include <vector>

std::vector<int>::const_iterator find(std::vector<int>::const_iterator begin, std::vector<int>::const_iterator end,int x)
{
   for (; begin < end; ++begin)
   {
       auto minimum = begin;
       for (auto index = begin; ++index < end;)
       {
           if (*index == x)
           {
               return index;
           }
       }
   }
   return end;
}
2

Tak. return wychodzi z funkcji i już, niezależnie od tego, jak bardzo zagnieżdżony jesteś.

To, czy takie rozwiązanie jest dobre dla czytelności kodu, to już inna sprawa… Moim zdaniem zazwyczaj jest, ale są ludzie, którzy tego unikają jak ognia.

1
  1. czemu nie uzyjesz std::find?
  2. mozna (przeciez Ci sie kompiluje ;)) ale moim zdaniem bardziej czytelnie jest, gdy w funkcji jest jeden return

czyli tam gdzie masz return zapisujesz wartosc ktora chcesz zwrocic i robisz break; na petli

0
fasadin napisał(a):
  1. czemu nie uzyjesz std::find?
  2. mozna (przeciez Ci sie kompiluje ;)) ale moim zdaniem bardziej czytelnie jest, gdy w funkcji jest jeden return

czyli tam gdzie masz return zapisujesz wartosc ktora chcesz zwrocic i robisz break; na petli

W treści zadania jest "Funkcja korzysta tylko z pliku nagłówkowego vector." więc break i find odpadają

0

break jest wbudowane w jezyk wiec nieodpada bo nie uzywa zadnego innego pliku naglowkowego

2
Adam Ciepieniak napisał(a):

Mam pytanie czy w funkcji można użyć dwukrotnie przerwania pętli wyrażeniem "return" ?

Nie ma co do tego żadnych przeciwwskazań.

Natomiast Brat @fasadin wpuszcza cię w maliny - break spowoduje wyskoczenie na zewnątrz jedynie tej zawierającej go pętli (czyli kod wskoczy do for (; itd) ) , i nie nadaje się aby zastąpić jasnego, czytelnego return <znaleziona wartość>

@Adam Ciepieniak: poza tym trochę przekombinowałeś z tą funkcją. Starczy ci takie coś:

std::vector<int>::const_iterator findFirstOccurence(std::vector<int>::const_iterator begin, std::vector<int>::const_iterator end,int valueToFind)// używaj bardziej opisowych nazw, parę literek więcej nie boli, a mocno poprawia czytelność kodu
{
   while (begin != end)
   {
      if (*begin == x)
      {
          break;//teraz break ma sens bo jest tylko 1 zagnieżdżenie pętli
          //albo alternatywna wersja dać return begin;
      }
      begin++;
   }
   
   return begin;// a ten return begin obsłuży zarówno wariant z break'iem, jak i bez break'a kiedy nie znajdzie szukanej wartości.
}

https://onlinegdb.com/S1c4ktW0m

1 użytkowników online, w tym zalogowanych: 0, gości: 1