Подтвердить что ты не робот

Что я получаю от front() пустого контейнера std?

Если front() возвращает ссылку, и контейнер пуст, что я получу, ссылку undefined? Означает ли это, что мне нужно проверить empty() перед каждым front()?

4b9b3361

Ответ 1

Вы получаете поведение undefined - вам нужно проверить, что контейнер содержит что-то, используя empty() (который проверяет, пустой контейнер) перед вызовом front().

Ответ 2

Вы получаете поведение undefined.

Чтобы получить проверку диапазона, используйте (0). Если это не удается, вы получаете исключение out_of_range.

Ответ 3

Да, вы можете использовать "at", как сказал Грэхем вместо использования фронта.

Но, при (0) доступно только для некоторых контейнеров - векторов, deque, а не для других - списка, очереди, стека. В этих случаях вы должны отказаться от безопасности "пустой" проверки.

Ответ 4

Undefined Поведение

Ответ 5

Вы всегда должны быть уверены, что ваш контейнер не пуст перед вызовом front() в этом экземпляре. Вызов пустой() как безопасный защитник хорош.

Конечно, в зависимости от вашего дизайна программы всегда наличие непустого контейнера может быть инвариантным выражением, позволяющим предотвратить и сохранить вызов empty() при каждом вызове front(). (или, по крайней мере, в какой-то части вашего кода?)

Но, как указано выше, если вы хотите избежать неопределенного поведения в своей программе, сделайте его сильным инвариантом.