Daniel ha chiesto: Mi chiedevo, come sta uguaglianza (==) stabilito per iteratori STL? È un semplice confronto tra puntatori (e quindi basato su indirizzi) o qualcosa di più stravagante?
Dipende dall'implementazione. In questo momento, su Visual C++ 2008, vedo il seguente codice (per l'elenco iteratore):
bool operator==(const _Myt_iter& _Right) const
{ // test for iterator equality
#if _HAS_ITERATOR_DEBUGGING
_Compat(_Right);
#else
_SCL_SECURE_TRAITS_VALIDATE(this->_Has_container() && this->_Same_container(_Right));
#endif /* _HAS_ITERATOR_DEBUGGING */
return (_Ptr == _Right._Ptr);
}
Vedrai sopra che v'è sia il codice per la verifica di validità iteratore, e _Ptr
essere un puntatore ad una lista nodo
Quindi immagino ci sia sia la verifica, sia il semplice confronto dei puntatori grezzi.
Daniel ha chiesto: Se ho due iteratori da due diversi oggetti lista e li metto a confronto, sarà il risultato sarà sempre falso?
Fino ad ora, sembra che lo standard non fosse chiaro sull'argomento. A quanto pare, saranno esplicitamente scrivere che questo tipo di operazione è indefinito risultati:
Citando: http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#446
Il risultato dell'utilizzo di qualsiasi operazione iteratore (24.2.1 [input.iterators], 24.2.2 [output.iterators], 24.2.3 [forward.iterators], 24.2.4 [bidirectional.iterators], 24.2.5 [random.access.iterators]) che utilizza due valori iteratori come argomenti (nota in calce) che erano ottenuto da due diversi intervalli r1 e r2 (compresi i loro valori passati) che non sono intervalli secondari di un intervallo comune non è definito, se non diversamente specificato.
nota) Tra gli altri queste operazioni sono ==, <, binario - e copiare l'assegnazione
Quindi credo che sia male per confrontare iteratore da contenitori diversi ... ^ _^
Daniel ha chiesto: E se confrontassi un valore valido con uno fuori gamma? È sempre falso?
Come sopra.
Non dovrebbe? Certamente non devi assolutamente! – xtofl
La possibilità di confrontare tecnicamente gli iteratori da diversi contenitori rende MSVC un fastidioso avviso di deprecazione quando si utilizza 'std :: copy' ... –