La diferencia entre c[i]
y c.at(i)
es que at()
tiros std::out_of_range
excepción si i
cae fuera del rango del vector, mientras que operator[]
simplemente invoca un comportamiento indefinido, lo que significa que cualquier cosa puede pasar.
Nadie dice at()
es mejor que operator[]
. Solo depende de las circunstancias. Como at()
realiza una comprobación de rango, puede que no sea siempre deseable, especialmente cuando el código en sí mismo asegura que el índice nunca puede quedar fuera del rango. En tales casos, operator[]
es mejor.
Considere el siguiente bucle:
for(size_t i = 0 ; i < v.size(); ++i)
{
//Should I use v[i] or v.at(i)?
}
En tal circuito, operator[]
es siempre una opción mejor en comparación con at()
función miembro.
Preferiría at()
cuando lo desee arrojar una excepción en caso de índice no válido, por lo que podría hacer el trabajo alternativo en el bloque catch{ ...}
. excepciones ayudan a separar el código normal a partir del código excepcional/alternativo como:
try
{
size_t i = get_index(); //I'm not sure if it returns a valid index!
T item = v.at(i); //let it throw exception if i falls outside range
//normal flow of code
//...
}
catch(std::out_of_range const & e)
{
//alternative code
}
Aquí podrías comprobar i
a sí mismo, para asegurarse de que es un índice válido, y luego llamar a operator[]
en lugar de at()
, pero mezclaría el código normal con el código alternativo usando el bloque if-else
que hace que sea difícil leer el flujo normal del código. Si ve arriba, try-catch
mejora la legibilidad del código, ya que realmente separa el código normal del código alternativo, lo que resulta en un código ordenado y limpio.
"¿Cuál es la diferencia?" es una buena pregunta La respuesta es: 1) comprobación automática de rango (.at() arrojará una excepción fuera de rango, [] fallará en silencio), y 2) preferencia personal - qué sintaxis te gusta más. "¿Qué es mejor?", Por otro lado, es un juicio de valor. La respuesta es necesariamente "depende". En mi humilde opinión ... – paulsm4
Nadie es mejor, tienen objetivos similares pero diferentes. –