2009-07-27 11 views
11

¿El Estándar C++ dice que debería poder comparar dos iteradores AWL construidos por defecto para la igualdad? ¿Los iteradores construidos por defecto son equivalentes a la igualdad?Comparación de iteradores construidos por defecto con operator ==

quiero lo siguiente, usando std :: lista, por ejemplo:

void foo(const std::list<int>::iterator iter) { 
    if (iter == std::list<int>::iterator()) { 
     // Something 
    } 
} 

std::list<int>::iterator i; 
foo(i); 

Lo que quiero aquí es algo así como un valor NULL para iteradores, pero no estoy seguro de si es legal. En la implementación de STL incluida con Visual Studio 2008, incluyen aserciones en el operador std :: list ==() que impiden este uso. (Comprueban que cada iterador es "propiedad" del mismo contenedor y los iteradores construidos por defecto no tienen contenedor). Esto daría a entender que no es legal, o quizás que están siendo demasiado celosos.

+0

'boost :: optional ' viene a la mente. – MSalters

Respuesta

15

Bien, daré una puñalada. The Standard ++ C, Sección 24.1/5:

iteradores también puede tener singulares valores que no están asociados con cualquier contenedor. [Ejemplo: después de la declaración de un puntero x no inicializado (como con int * x;), siempre se debe suponer que x tiene un valor singular de un puntero. ] Los resultados de la mayoría de las expresiones no están definidos para los valores singulares ; la única excepción es una asignación de un valor no singular a un iterador que contiene un valor singular de .

Entonces, no, no se pueden comparar.

+0

Bien, lo tiene :) – AraK

+0

¿Qué pasa con 'std :: istream_iterator. Así es exactamente como se compara la prueba para el final. –

1

Creo que debe pasar rango a la función.

void fun(std::list<int>::iterator beg, std::list<int>::iterator end) 
{ 
    while(beg != end) 
    { 
     // do what you want here. 
     beg++; 
    } 
} 
+1

Posiblemente cierto, pero no responde la pregunta. –

+0

Sí, solo mis 2 centavos :) – AraK

+1

Entiendo lo que dices, pero la semántica realmente requiere un solo elemento, al igual que std :: list :: erase(). Puedo estar abusando del concepto de un iterador; eso es lo que me interesa descubrir. – Adrian

1

La especificación dice que la condición posterior del constructor predeterminado es que el iterador es singular. La comparación de igualdad no está definida, por lo que puede ser diferente en alguna implementación.

6

Esto va a cambiar en C++ 14. [Forward.iterators] 24.2.5p2 de N3936 dice

Sin embargo, los iteradores de valor inicializado puede compararse y se compara igual a otros iteradores de valor inicializado del mismo tipo.

+0

Llegué a esto ahora mismo al implementar algo en el trabajo :(Yo deseaba tener C++ 2014 pero solo tengo Visual Studio 2012: D –

+0

Esto todavía no es una buena idea, incluso en C++ 14 porque los iteradores no singulares pueden no se compara con un iterador inicializado de valor. –