So che at()
è più lento di []
a causa del suo controllo di confine, che è anche discusso in questioni simili, come C++ Vector at/[] operator speed o ::std::vector::at() vs operator[] << surprising results!! 5 to 10 times slower/faster!. Semplicemente non capisco per cosa sia utile il metodo at()
.vector :: al vs. vector :: operator []
Se ho un semplice vettore come questo: std::vector<int> v(10);
e decido di accedere ai suoi elementi utilizzando at()
invece di []
nella situazione in cui ho un indice di i
e non sono sicuro se i suoi limiti in vettori, forza mi avvolgerlo con blocco try-catch:
try
{
v.at(i) = 2;
}
catch (std::out_of_range& oor)
{
...
}
anche se sono in grado di fare lo ottenere lo stesso comportamento utilizzando size()
e controllando l'indice per conto mio, che sembra più facile e molto conveniente per me :
if (i < v.size())
v[i] = 2;
Quindi la mia domanda è:
Quali sono i vantaggi di utilizzare vector::at sopra vector::operator[]?
Quando è necessario utilizzare vector::at anziché vector::size + vector::operator[]?
+1 molto buona domanda !! ma non penso che sia comunemente usato. –
Nota che nel tuo codice di esempio, 'if (i = v.size()'. Quindi non c'è una ragione particolare per cui * non dovrebbe * usare un'eccezione per indicare una situazione inaspettata. Molte funzioni usano semplicemente 'operator []' senza un controllo rispetto alla dimensione, documentano che 'i' deve essere nel raggio d'azione e incolpano l'UB risultante sul chiamante. –