2009-03-25 9 views

Odpowiedz

41

Otrzymujesz niezdefiniowane zachowanie - musisz sprawdzić, czy kontener zawiera coś za pomocą empty() (które sprawdza, czy kontener jest pusty) przed wywołaniem funkcji front().

+0

Możesz również użyć pustego(). –

+1

Szkoda, że ​​nie były bardziej szczegółowe, gdy projektowały i określały STL. Wydaje mi się, że wiele problemów związanych z portowaniem w C++ i błędów jest powodowanych przez specyfikacje platformowe tych "niezdefiniowanych zachowań", które są wykorzystywane przez niezbyt dobrych programistów. –

+0

Decyzja o zrobieniu czegoś UB zwykle oznacza, że ​​w alternatywnym przypadku jest trochę narzut - w tym przypadku wyrzucenie wyjątku, którego C++ zawsze stara się unikać. –

12

Otrzymujesz niezdefiniowane zachowanie.

Aby uzyskać sprawdzanie zasięgu użyj w (0). Jeśli to się nie powiedzie, otrzymasz wyjątek out_of_range.

1

Zawsze trzeba mieć pewność, że pojemnik nie jest pusty przed wywołaniem przedni() w tej instancji. Wywołanie empty() jako bezpiecznego strażnika jest dobre.

Oczywiście, w zależności od projektu programu, zawsze posiadanie niepustego kontenera może być niezmiennym stwierdzeniem, które pozwala zapobiegać i zapisywać wywołanie funkcji empty() przy każdym wywołaniu funkcji front(). (lub przynajmniej w jakiejś części twojego kodu?)

Jednak, jak stwierdzono powyżej, jeśli chcesz uniknąć nieokreślonego zachowania w swoim programie, uczyń go silnym niezmiennikiem.

2

Tak, możesz użyć 'at', jak wspomniany Graham zamiast używać frontu.

Ale, w (0) jest dostępna tylko dla niektórych kontenerów - wektorów, deque, a nie dla innych - lista, kolejka, stos. W takich przypadkach musisz powrócić do bezpieczeństwa "pustego" czeku.

Powiązane problemy