2012-04-30 17 views
6

In Qt ci sono classi simili per elencare una mappa. Queste classi forniscono un metodo begin_const() che restituisce un const_iterator. La documentazione dice che questi costitutori dovrebbero essere usati quando possibile poiché sono più veloci.Efficienza diversa di iteratore e const_iterator (STL)

STL fornisce un const_iterator solo se l'istanza stessa è const. Viene implementato solo un metodo begin() (sovraccaricato per const).

C'è qualche differenza quando si accede in lettura agli elementi con iteratore e const_iterator? (I dont'w so perché c'è una differenza per loro in Qt)

+2

Quando si passa dall'antico stl alla versione corrente della libreria standard C++, si otterrà una funzione cbegin che restituisce const_iterators. Si noti inoltre che è possibile assegnare iteratori a const_iterators e che la versione const di begin restituisce anche un iteratore const (tutto per la libreria standard C++). – PlasmaHH

+0

Il mio riferimento era cplusplus.com. Non c'è cbegin(). Puoi indicarmi un riferimento STL piacevole e aggiornato? Ora la domanda è ancora più pressante poiché esiste un metodo cbegin() ... – HWende

+0

La funzione che PlasmaHH sta puntando fa parte di C++ 11: [articolo] (http://www.cplusplus.com/articles/EzywvCM9 /) ma non so se ci sono problemi di prestazioni per l'utilizzo degli iteratori anziché degli iteratori const. – Uflex

risposta

5

La documentazione precisa che si tratta const_iterators dovrebbero essere usati quando possibile dal momento che sono più veloci.

Lo fa sicuramente. Da http://qt-project.org/doc/qt-4.8/containers.html#stl-style-iterators:

Per ogni classe contenitore, ci sono due tipi di iteratori STL-stile: uno che fornisce accesso in sola lettura e uno che fornisce accesso in lettura-scrittura. Gli iteratori di sola lettura dovrebbero essere utilizzati laddove possibile perché sono più veloci degli iteratori di lettura-scrittura.

Che cosa stupida da dire.

Più sicuro? Sì. Più veloce? Anche se questo fosse il caso (apparentemente non è con gcc e clang), raramente è un motivo per preferire gli iteratori const su quelli non costanti. Questa è l'ottimizzazione prematura. La ragione per preferire gli iteratori const su quelli non costanti è la sicurezza. Se non è necessario modificare i contenuti puntati, utilizzare un iteratore const. Pensa a ciò che alcuni programmatori di manutenzione faranno al tuo codice.

Per quanto riguarda begin rispetto a cbegin, si tratta di un'aggiunta di C++ 11. Ciò consente alla parola chiave auto di utilizzare un iteratore const, anche in un'impostazione non const.

+0

Quindi anche se in qualche modo ci potrebbe essere una differenza in Qt I per ora supponiamo che non ci sia nessuno in C++. Accetto inoltre di non annullare la normale/const solo per motivi di prestazioni. Grazie per la chiara dichiarazione! – HWende

3

Il motivo migliore per utilizzare const è evitare errori e rendere più chiaro l'intento del codice.

È concepibile che, in alcuni casi, il compilatore possa eseguire alcune ottimizzazioni che non sarebbero possibili con un iteratore non const. L'aliasing (quando più variabili e parametri possono fare riferimento allo stesso oggetto) è spesso un inibitore di alcune ottimizzazioni. Se il compilatore può escludere alcune forme di aliasing notando che il const-iterator non può mai cambiare il valore, allora forse abiliterebbe alcune ottimizzazioni.

D'altra parte, mi aspetto che un compilatore sia abbastanza buono da usare la costanza in questo modo per essere in grado di raggiungere la stessa conclusione con l'analisi del flusso.