2013-06-04 15 views
6

Attualmente sto imparando STL e ho avuto alcune incertezze su find e cost iteratori. Diciamo che ho una funzione di ricerca:STL C++, iteratori costanti, find()

some_stl_container::const_iterator found = myContainer.find(value); 

Dopo di che dovrei controllare quello che ho ottenuto per found contro un altro const_iterator, o è valido per effettuare un controllo contro semplicemente un iteratore. In sostanza ci sarebbe alcuna differenza tra fare questo:

if(found!=myContainer.cend()) 

e questo:

if(found!=myContainer.end()) 

I primi sguardi più accurata (almeno per me), ma il secondo dovrebbe funzionare bene, giusto?

+0

possibile duplicato di [confronto const iteratore non const, sono validi] (http://stackoverflow.com/questions/16900498/const-to-non-const-iterator-comparisons-are-the-- valido) – juanchopanza

+0

Considerando che 'cend' non esisteva fino al C++ 11, ci doveva essere * un * modo * per farlo. –

risposta

8

Tutti i contenitori di libreria standard soddisfano il requisito che Container::iterator è convertibile in Container::const_iterator. Quindi entrambi i confronti sono validi e produrranno lo stesso risultato.

Da §23.2.1 - Tabella 96

X::iterator... qualsiasi categoria iteratore che incontra l'iteratore in avanti requisiti. convertibile in X::const_iterator.

+0

La cosa divertente è che ho appena provato a trovare la conferma che 'x.cend() == X :: const_iterator (x.end())' in uno standard. E non l'ho trovato (forse mi manca qualche ovvia conclusione logica). Per definizione 'x.cend() == const_cast (x) .end()' ma non vedo come ciò provi la prima affermazione. –

+0

@SergeDundich Non sono sicuro di aver capito la tua domanda. Quello che ho citato afferma chiaramente che, quando si tratta di contenitori, 'iterator' è convertibile in' const_iterator'. Se ti stai chiedendo cosa ci consente di utilizzare 'operator ==' per confrontare 2 iteratori, fai riferimento a [questa risposta] (http://stackoverflow.com/a/16901637/241631) della mia. – Praetorian

1

Controllare se l'iteratore è diverso da myContainer.end() sta bene. I metodi cend e cbegin sono qui solo per ottenere esplicitamente gli iteratori const, quindi non fa differenza nel tuo caso.

Nota che si poteva fare auto found = myContainer.find(value) in C++ 11 di dedurre il tipo di iteratore, e che alcune persone sostengono che libreria standard è il nome corretto (non STL).

+1

Informazioni sulla seconda osservazione: http://en.wikipedia.org/wiki/Standard_Template_Library – lightxbulb

+0

Intendo http://en.wikipedia.org/wiki/C%2B%2B_Standard_Library che in realtà è diversa dalla STL originale (vedere http://stackoverflow.com/questions/5205491/whats-this-stl-vs-c-standard-library-fight-all-about) ma questo è un argomento barbuto-purista: p –

+0

@ lightxbulb: come l'articolo che colleghi per descrivere, la STL è un'antica libreria che ha ispirato parti della moderna libreria standard. La tua domanda riguarda specificamente la libreria standard C++ 11, non quella STL (poiché i contenitori STL non disponevano di funzioni 'cend'). –