Eu sei que at()
é mais lento do que []
por causa de sua verificação de limite, que também é discutida em questões semelhantes como C ++ Vector at / [] operator speed ou :: std :: vector :: at () vs operator [] << resultados surpreendentes !! 5 a 10 vezes mais lento / rápido! . Só não entendo para que at()
serve o método.
Se eu tenho um vetor simples como este: std::vector<int> v(10);
e decido acessar seus elementos usando em at()
vez de []
em situação quando eu tenho um índice i
e não tenho certeza se ele está nos limites de vetores, isso me força a envolvê-lo com try-catch bloco :
try
{
v.at(i) = 2;
}
catch (std::out_of_range& oor)
{
...
}
embora eu seja capaz de obter o mesmo comportamento usando size()
e verificando o índice por conta própria, o que parece mais fácil e muito conveniente para mim:
if (i < v.size())
v[i] = 2;
Portanto, minha pergunta é:
Quais são as vantagens de usar vector :: at em vez de vector :: operator [] ?
Quando devo usar vector :: at em vez de vector :: size + vector :: operator [] ?
if (i < v.size()) v[i] = 2;
, há um caminho de código possível que não é atribuído 2
a nenhum elemento de v
. Se esse for o comportamento correto, ótimo. Mas muitas vezes não há nada sensato que essa função possa fazer quando i >= v.size()
. Portanto, não há nenhuma razão específica para não usar uma exceção para indicar uma situação inesperada. Muitas funções apenas usam operator[]
sem uma verificação em relação ao tamanho, documento que i
deve estar dentro do intervalo e culpam o UB resultante no chamador.