2013-02-05 14 views
5

Mi è stato insegnato il string::at a scuola, ma esplorando la libreria di stringhe ho visto string::operator[], che non mi è mai stato mostrato prima.Qual è la differenza tra string :: at e string :: operator []?

Ora sto usando operator[] e non ho usato at da allora, ma qual è la differenza? Ecco alcuni esempi di codice:

std::string foo = "my redundant string has some text"; 
std::cout << foo[5]; 
std::cout << foo.at(5); 

Essi sono essenzialmente gli stessi in termini di produzione, ma ci sono alcune sottili differenze che non sono a conoscenza?

+3

Hai provato un punto di riferimento per ciascuno? C'è una differenza, che dovrebbe essere abbastanza facile da individuare quando si confrontano i riferimenti. – chris

+1

Aspetta, hai deciso di passare da '.at()' a 'operator []' * prima * guardando un libro o un riferimento online? – us2012

+0

beh, ho letto che l'operatore [] era più veloce, ma non sapeva perché ... –

risposta

15

Sì, c'è una grande differenza: utilizzando .at() fa un test di ricezione sull'indice passava e genera un'eccezione se è finita la fine della stringa, mentre operator[] porta solo comportamento indefinito in quella situazione.

10

atil controllo dei limiti, eccezione del tipo std::out_of_range verrà generato in caso di accesso non valido.

operator[]NON controlla i limiti e quindi può essere pericoloso se si tenta di accedere oltre i limiti della stringa. È un po 'più veloce di at.

4

std :: string :: a

Restituisce un riferimento al personaggio in posizione specificata pos. Viene eseguito il controllo dei limiti, eccezione per il tipo std :: out_of_range che verrà lanciato in caso di accesso non valido.

string :: operator []

Restituisce un riferimento al personaggio in posizione specificata pos. Non viene eseguito alcun controllo dei limiti. È un comportamento indefinito accedere a fuori confine con operator[].

string::operator[] dovrebbe essere più veloce di silghtly std::string::at

vedere il reference

Problemi correlati