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.
'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
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