Я знаю, что at()
медленнее, чем []
из-за его граничной проверки, что также обсуждается в похожих вопросах, таких как C++ Vector at/[] operator speed или ::std::vector::at() vs operator[] << surprising results!! 5 to 10 times slower/faster!. Я просто не понимаю, для чего подходит метод at()
.vector :: at vs. vector :: operator []
Если у меня есть простой вектор, как этот: std::vector<int> v(10);
и я решил получить доступ к его элементам с помощью at()
вместо []
в ситуации, когда у меня есть индекс i
, и я не уверен, что если его в векторы границ, она заставляет мне обернуть его с блоком примерки поймать:
try
{
v.at(i) = 2;
}
catch (std::out_of_range& oor)
{
...
}
хотя я в состоянии сделать то получить такое же поведение с помощью size()
и проверки индекса на моем собственном, который кажется более легким и очень удобно для меня :
if (i < v.size())
v[i] = 2;
Так что мой вопрос:
Каковы преимущества использования vector::at над vector::operator[]?
Когда следует использовать vector::at, а не vector::size + vector::operator[]?
+1 очень хороший вопрос !! но я не думаю, что в() это обычно используется. –
Обратите внимание, что в вашем примере кода 'if (i = v.size()'. Поэтому нет особых причин, по которым * не следует использовать исключение, чтобы указать на непредвиденную ситуацию. Многие функции просто используют 'operator []' без проверки на размер, документ, который 'i' должен находиться в зоне действия, и обвинять полученный UB в вызывающем. –