container - set std c++
¿Cuál es el valor predeterminado de un iterador? (3)
El constructor predeterminado inicializa un iterador a un valor singular :
Los iteradores también pueden tener valores singulares que no están asociados con ninguna secuencia. [Ejemplo: después de la declaración de un puntero x no inicializado (como con int * x;), siempre se debe asumir que x tiene un valor singular de un puntero. -Primer ejemplo] Los resultados de la mayoría de las expresiones no están definidos para valores singulares [24.2.1 §5]
Para cualquier contenedor STL que estoy usando, si declaro un iterador (de este tipo de contenedor particular) usando el constructor predeterminado del iterador, ¿en qué se inicializará el iterador?
Por ejemplo, tengo:
std::list<void*> address_list;
std::list<void*>::iterator iter;
¿A qué se inicializará?
El iterador no se inicializa, solo como int x;
declara un entero que no está inicializado. No tiene un valor definido correctamente.
Por convención, un "iterador NULL" para contenedores, que se usa para indicar que no hay resultados, se compara con el 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, dado que un iterador de contenedor construido por defecto no está asociado a ningún contenedor en particular, no hay un buen valor que pueda 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 puede no ser cierto. Por ejemplo, en el caso de istream_iterator
, un iterador construido por defecto representa (compara igual a) un istream_iterator
que ha alcanzado el EOF de un flujo de entrada.