2010-08-03 13 views
48

Para cualquier contenedor de STL que estoy usando, si declaro un iterador (de este tipo de contenedor en particular) usando el constructor predeterminado del iterador, ¿en qué se inicializará el iterador?¿Cuál es el valor predeterminado de un iterador?

Por ejemplo, tengo:

std::list<void*> address_list; 
std::list<void*>::iterator iter; 

Lo que se iter ser inicializado a?

+0

'std :: list :: iterator iter;' es una __definición__. Si bien todas las definiciones son declaraciones, una declaración que no es una definición sería: 'extern std :: list :: iterator iter;'. – sbi

+0

En particular, el constructor pertenece a la _definición_, no a ninguna otra declaración. Esto significa que puede pasar valores al constructor solo en la definición (única). Además, si el ctor es una plantilla (como aquí), se crea una instancia donde está la definición. – MSalters

Respuesta

43

Por convención un "iterador NULL" para los contenedores, que se utiliza para indicar ningún resultado, compara igual al resultado de container.end().

std::vector<X>::iterator iter = std::find(my_vec.begin(), my_vec.end(), x); 
if (iter == my_vec.end()) { 
    //no result found; iter points to "nothing" 
} 

Sin embargo, desde un iterador contenedor predeterminado-construido no está asociado con cualquier recipiente particular, no hay buen valor que podría tomar. Por lo tanto, es solo una variable no inicializada y la única operación legal que tiene que ver es asignarle un iterador válido.

std::vector<X>::iterator iter; //no particular value 
iter = some_vector.begin(); //iter is now usable 

Para otros tipos de iteradores esto podría no ser cierto. Por ejemplo, en el caso de istream_iterator, un iterador construido por defecto representa (se compara igual a) un istream_iterator que ha alcanzado el EOF de un flujo de entrada.

+2

Existe una propuesta para que exista un iterador inicializado de valor. Ver http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3644.pdf – Ghita

+3

En esa propuesta escribir auto ni = vector :: iterator() crearía un vector nulo iterator eso se compararía igual a cualquier otro iterador del mismo tipo – Ghita

10

El iterador no se inicializa, al igual que int x; declara un entero que no se inicializa. No tiene un valor definido correctamente.

+2

¿Hay alguna manera de inicializar iter en NULL? –

+3

@The Void: su pregunta no tiene sentido. 'NULL' es un valor que _pointers_ puede tener, iteradores de bot. Si bien todos los punteros son iteradores, no todos los iteradores son punteros. – sbi

+0

Entonces, si bien existe un puntero NULL, ¿no existe un "iterador NULL"? –

20

El constructor predeterminado inicializa un iterador a un valor singular :

iteradores también puede tener valores singulares que no están asociados con cualquier secuencia. [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. -end ejemplo] Resultados de la mayoría de las expresiones no están definidos para valores singulares [24.2.1 § 5]

+11

Mi aversión standardese golpea de nuevo. '' ¿Qué significa eso en un habla comprensible? – sbi

+1

@sbi: Bueno, el párrafo sigue y sigue, decidí cortarlo. Básicamente, no tiene permitido hacer nada útil con un valor singular, por ejemplo, desreferenciarlo o compararlo. – fredoverflow

+6

@sbi: simplemente reemplace todas las instancias de "singular" por "raro". No puedes hacer nada con eso porque está en un estado extraño. – jalf

Cuestiones relacionadas