Что я получу от front () пустого стандартного контейнера? - PullRequest
46 голосов
/ 25 марта 2009

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

Ответы [ 5 ]

53 голосов
/ 25 марта 2009

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

13 голосов
/ 25 марта 2009

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

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

3 голосов
/ 19 октября 2011

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

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

1 голос
/ 27 марта 2009

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

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

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

1 голос
/ 25 марта 2009

Неопределенное поведение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...