Если front()
возвращает ссылку, и контейнер пуст, что я получу, ссылку undefined? Означает ли это, что мне нужно проверить empty()
перед каждым front()
?
Что я получаю от front() пустого контейнера std?
Ответ 1
Вы получаете поведение undefined - вам нужно проверить, что контейнер содержит что-то, используя empty() (который проверяет, пустой контейнер) перед вызовом front().
Ответ 2
Вы получаете поведение undefined.
Чтобы получить проверку диапазона, используйте (0). Если это не удается, вы получаете исключение out_of_range
.
Ответ 3
Да, вы можете использовать "at", как сказал Грэхем вместо использования фронта.
Но, при (0) доступно только для некоторых контейнеров - векторов, deque, а не для других - списка, очереди, стека. В этих случаях вы должны отказаться от безопасности "пустой" проверки.
Ответ 4
Undefined Поведение
Ответ 5
Вы всегда должны быть уверены, что ваш контейнер не пуст перед вызовом front() в этом экземпляре. Вызов пустой() как безопасный защитник хорош.
Конечно, в зависимости от вашего дизайна программы всегда наличие непустого контейнера может быть инвариантным выражением, позволяющим предотвратить и сохранить вызов empty() при каждом вызове front(). (или, по крайней мере, в какой-то части вашего кода?)
Но, как указано выше, если вы хотите избежать неопределенного поведения в своей программе, сделайте его сильным инвариантом.