2011-11-04 22 views
5

Sto cercando di capire cosa significa const_iterator. Ho il seguente codice esempio:Informazioni su const_iterator con i puntatori?

void CustomerService::RefreshCustomers() 
{ 
    for(std::vector<Customer*>::const_iterator it = customers_.begin(); 
     it != customers_.end() ; it ++) 
    { 
     (*it)->Refresh(); 
    } 
} 

Refresh() è un metodo nella classe Customer e non è definito come const. Inizialmente pensavo che il const_iterator avrebbe dovuto impedire la modifica degli elementi del contenitore. Tuttavia, questo codice viene compilato senza lamentarsi. È perché c'è un livello extra di indirezione in corso? Che cosa fa esattamente const_iterator/mean?

UPDATE

E in una situazione come questa, è buona norma usare const_iterator?

+0

"modifica" significherebbe "* it = some_other_thing", che non è quello che stai facendo. –

risposta

10

A const_iterator su un vector<Customer*> ti darà un Customer * const non un Customer const*. Quindi non puoi realmente cambiare il valore che viene ripetuto (un puntatore), ma puoi sicuramente cambiare l'oggetto a cui fa riferimento. Fondamentalmente tutto ciò che dice nel tuo caso è che non puoi fare questo:

*it = ..something..; 
4

Non stai modificando il contenuto del contenitore. I contenuti del contenitore sono solo dei puntatori. Tuttavia, puoi liberamente modificare qualunque cosa puntino i puntatori.

Se non si desidera poter modificare le indicazioni dei puntatori, è necessario un vector<const Customer*>.

2

const_iterator è non se è possibile modificare il contenitore o meno, ma se è possibile modificare gli oggetti nel contenitore o meno. Nel tuo caso il contenitore contiene dei puntatori e non puoi modificare i puntatori stessi (non più di quanto potresti modificare gli interi ...) Puoi ancora effettuare una chiamata a non-const Refresh() dietro un puntatore dalla collezione, perché quella chiamata fa non modificare il puntatore stesso.

La differenza tra const_iterator e iterator è importante [solo] quando il contenitore contiene ad es. istanze di classe, non puntatori a loro, ma le istanze stesse, ad esempio in un contenitore

list < pair < int , int > > 

Se 'it' è un const_iterator in questo elenco, non si può fare

it->first = 5 

ma se è iteratore (non const_iterator), che funziona.

+0

Si tratta anche di modificare il contenitore: funzioni come 'cancella' e' inserisci' possono essere chiamate con un 'iteratore' ma non un' const_iteratore'. –

+0

@ MikeSeymour No non è come stai dicendo. Puoi ancora usare sia 'cancella' che' inserisci' con un 'const_iterator'. In realtà C++ 11 ha modificato in particolare quelli per prendere un 'const_iterator' piuttosto che un' iterartor': http://www.cplusplus.com/reference/list/list/insert/ http://www.cplusplus.com/reference/elenco/list/cancellare / – jbx