Должен ли я использовать 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, которое [] не делает.

Таким образом, хотя [] может привести к сбою вашего приложения немедленно, если вы попытаетесь получить доступ к чему-то вне диапазона, функция() позволит вам обрабатывать ошибку во время выполнения.

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