Daniel preguntó: Me preguntaba, ¿cómo está (==) estableció la igualdad para los iteradores STL? ¿Es una comparación de puntero simple (y por lo tanto, basada en direcciones) o algo más elegante?
Depende de la implementación. En este momento, en Visual C++ 2008, veo el siguiente código (para el iterador de la lista):
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);
}
Verás anterior que existe tanto el código de verificación de la validez iterador, y _Ptr
ser un puntero a una nodo de lista.
Así que supongo que hay verificación, y simple, comparación de puntero sin formato.
Daniel preguntó: Si tengo dos iteradores de dos objetos de lista diferentes y los comparo, será el resultado siempre es falsa?
Hasta ahora, parece que el estándar no estaba del todo claro sobre el tema. Al parecer, van a escribir explícitamente que este tipo de operación ha indefinido resultados:
Citando: http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#446
El resultado del uso de cualquier operación iterador (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]) que utiliza dos valores de iterador como argumentos (nota al pie) que fueron obtenido a partir de dos rangos diferentes r1 y r2 (incluidos sus valores pasados) que no son subrangos de un rango común no está definido, a menos que se describa explícitamente lo contrario.
nota al pie), entre otros estas operaciones son ==, <, binario -, y copiar la asignación
así que supongo que es malo para comparar iterador de diferentes contenedores ... ^ _^
Daniel preguntó: ¿Qué tal si comparo un valor válido con uno que está fuera de rango? ¿Eso siempre es falso?
Igual que el anterior.
¿En realidad no se supone que deba hacerlo? ¡Sin duda no debes! – xtofl
La capacidad de comparar iteradores de diferentes contenedores hace que MSVC emita una advertencia de obsolescencia molesta al usar 'std :: copy' ... –