Чтобы использовать «at» или [] для безопасного доступа к члену std :: vector - PullRequest
2 голосов
/ 08 января 2012

у меня был массив

arr[10]

Попытка доступа

arr[12]

и программа ничего не делала, пока я не понял, когда переключился на векторы. Где-то я читал, что если я использую [], тогда программа не выдаст ошибку времени выполнения, поэтому я должен использовать std::vector at. Но в своей программе я просто использовал [], и это помогло мне определить проблему. Кажется, [] достаточно. Я прав? Кроме того, есть ли обязательная проверка массивов на безопасность?

Ответы [ 2 ]

8 голосов
/ 08 января 2012

Некоторые реализации библиотеки C ++ имеют режим отладки, который выдает исключение, даже если вы используете синтаксис [], но это не определено стандартом. Так что это может быть то, что вы испытали. Если вы хотите быть уверены, что вы должны использовать at().

C ++ не имеет проверки границ для примитивных массивов, однако, если ваш компилятор поддерживает новейшую версию C ++, вы можете использовать std::array вместо примитивных массивов, и этот контейнер имеет метод at(), такой же как std::vector .

Я бы рекомендовал использовать std::array, даже если вы не хотите использовать эту функцию, потому что у примитивных массивов есть некоторые другие проблемы (например, они распадаются на указатели по капле шляпы). std::array ведет себя гораздо более согласованно (например, вы можете передавать их по значению в функции или возвращать их, и они будут работать правильно, тогда как написание очевидного синтаксиса для передачи массива по значению не удастся и вместо этого просто передаст указатель).

Сделайте себе одолжение и никогда не используйте примитивные массивы.

3 голосов
/ 08 января 2012

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

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