2013-08-17 3 views
0

Что разница о вставке значения в вектор между этими двумя методами:Что действительно делает функция stat :: vector .at()?

vector<int> vectorlist (12); 
vectorlist[12]=23; 

Против:

vector<int> vectorlist (12); 
vectorlist.at(12)=23; 
+4

Ни один из них не должен использоваться для * вставки * чего-то. В вашем случае вы увидите разницу, просто запустив свой код (если только UB не приведет к тому, что то же самое произойдет, как и в другом случае). – chris

+0

Я думаю, что второй вызовет исключение, и первое будет иметь неопределенное поведение, потому что размер вектора составляет 12 элементов, а не 13. Возможно, емкость будет больше. – Benoit

+0

@IvanaGajic - см. Этот вопрос, регрессирующий 'at'. – jww

ответ

4

.at (...) делает связанную проверку, в то время как оператор [] не работает, т. Е. Находится за пределами допустимого диапазона.

Смотрите документацию здесь:

http://www.cplusplus.com/reference/vector/vector/at/

«Функция автоматически проверяет, является ли п в пределах допустимых элементов в векторе, выбрасывая исключение out_of_range, если это не так (то есть, если п больше или равно его размеру). Это контрастирует с оператором-членом [], который не проверяет границы. "

или:

http://www.cplusplus.com/reference/vector/vector/operator[]/

«Подобная функция, вектор :: в, имеет такое же поведение, как этот оператор-функции, за исключением того вектора :: на неизбежно проверены и сигналы, если запрашиваемое позиция выходит за допустимые пределы, выбрасывая исключение out_of_range ».

Немного не по теме, но вы не должны использовать термин «vectorlist» для вектора. Сначала я думал, что по какой-то причине у вас будет список данных.

Итак, чтобы дать вам пример реального мира: вы можете использовать вариант без привязки, если вы уверены, что индекс внутри диапазона, потому что это приведет к чуть более быстрому коду.

+0

+1 только один nitpick: сайт cpluplus.com содержит много ошибок, даже если это правильно для этого ответа. Предпочитают давать цитаты из (самого доступного черновика) самого стандарта или, по крайней мере, из лучших ссылочных сайтов, таких как en.cppreference.com – TemplateRex

+0

Stackoverflow стремится дать авторитарные ответы; для C++ существует только один источник - Standard. На самом деле не так сложно получить ответы на простые вопросы API. – TemplateRex

+0

нет в этом случае все нормально. но неавтоматические сайты, такие как wikipedia или cplusplus.com, должны использоваться только для показа примерных программ. – TemplateRex

0

Согласно стандарту C++:

аналогичной функции члена, vector :: at, имеет такое же поведение, как и эта функция [], за исключением того, что vector :: at проверен на границе и сигнализирует, если запрошенная позиция вне допустимого диапазона, выбрасывая out_of_ra исключение.

+1

Кроме того, 'at' медленнее из-за этой особой причины по сравнению с' [] '. –

Смежные вопросы