Должен ли я использовать std::vector:: at() в моем коде
Сегодня я заметил, что std::vector::at()
значительно медленнее, чем доступ к значениям с квадратными скобками []
. Согласно документу .at()
безопаснее, потому что он не позволит мне получить доступ к значениям за пределами массива. Однако, даже если я получаю доступ к связанным значениям с помощью at()
, у меня, очевидно, все еще будет ошибка, так что мне что-то нужно избегать, несмотря ни на что.
Итак, есть ли веская причина, почему кто-то использовал at()
вместо []
?
Ответы
Ответ 1
Если у вас есть основания полагать, что индекс не находится под вашим контролем, или если поток управления особенно сложный и вы трассируете ошибки, тогда вы можете использовать at()
во время фазы отладки, но никогда внутри циклов или любой ситуации, когда вы знаете, что индекс безопасен.
Даже в других ситуациях вы должны либо превалировать индекс (например, если он вводится пользователем), либо если вы просто получаете значение из сложного алгоритма, используйте assert
и исправьте ошибку, если она есть. [Edit.] Или, возможно, если вы пишете очень сложный алгоритм, и вы не уверены, что все ваши индексы всегда действительны, вы можете использовать at()
внутри этого алгоритма и поместить вызов в блок try, но даже здесь желательно быть оскорбительным и использовать с утверждениями. [/]
Лично я не вижу никаких веских причин для at()
, чтобы выжить в коде выпуска. Вы могли бы придумать некоторые примеры, когда вы хотите использовать обработку исключений как удобный способ для управления потоком управления, но любой такой вариант использования будет очень ситуативным.
Ответ 2
Разница между at()
и operator[]
заключается в том, что at()
сигнализирует, если запрошенная позиция вне допустимого диапазона, выбрасывая исключение out_of_range.
Таким образом, с помощью at()
вы можете реагировать на состояние ошибки. Использование оператора [] для доступа к вектору вне индекса приведет к поведению undefined.
Ответ 3
at
проверяет диапазон, но operator[]
нет. Например, если вы пройдете -1 до at()
, будет выбрано значение std::out_of_range
. Но если вы сделаете то же самое с operator[]
, это сработает или произойдет странное.
Если вы абсолютно уверены, что индекс в порядке или вы хотите выполнить проверку самостоятельно, используйте operator[]
.
Ответ 4
at()
возвращает элемент с индексом i
и выдает исключение ошибки диапазона, если индекс i
выходит за допустимые пределы. поэтому я бы предложил использовать at()
, а не []
, поскольку он дает поведение undefined, если оно выходит за пределы диапазона. если вы хотите, чтобы безопасность в вашей прогги использовалась at()
:).
Ответ 5
Предполагая, что вы не используете исключения как некоторую сигнальную систему, разница в том, что vector::at()
ВСЕГДА генерирует исключение, когда вы пытаетесь получить доступ к индексу за пределами границ.
vector::operator[]
может возвращать значение undefined ИЛИ выдавать исключение нарушения доступа (или сбой).
Ответ 6
at() выдает исключение out_of_range, которое [] не делает.
Таким образом, хотя [] может привести к сбою вашего приложения немедленно, если вы попытаетесь получить доступ к чему-то вне диапазона, функция() позволит вам обрабатывать ошибку во время выполнения.
Если это необходимо для вас (часто это не так, потому что доступ к чему-то вне пределов диапазона автоматически означает, что семантика вашего кода не работает так, как предполагается) вы должны использовать в().