2012-05-21 8 views
9

que usar algo como esto:¿Cuál es el valor de retorno de map :: begin() para un mapa vacío?

map<string, Data>::iterator it = mymap->begin(); 
map<string, Data>::iterator end = mymap->end(); 

while (it != end) { 
    // do stuff 
    ++it; 
} 

Me preguntaba si esto funciona incluso si el mapa está vacía. No pude encontrar ninguna información sobre la devolución de map :: begin() si el mapa no está vacío.

+0

¿Puedo sugerir simplemente crear un pequeño programa para simplemente probarlo? –

+1

'std :: distance (begin, end)' será cero. –

+0

¡Agradable! No estaba al tanto de esta función. – HWende

Respuesta

15

Si el mapa está vacío, los iteradores begin y end son iguales, es decir, devuelve mymap->end().

+0

Esto es cierto, y siempre debe comparar el iterador devuelto por 'begin()' a 'end()' antes de usarlo si el mapa puede haber estado vacío (observe cómo su ciclo usa 'while() ...' no 'do ... while()', por lo que prueba correctamente antes de ejecutar la instrucción controlada). Pregunta cuál es el valor; podría ser cualquier cosa que proporcione que se compare con 'end()' e incorporando la necesidad de que los iteradores difieran de los elementos reales ... el estándar deja al compilador/implementación para elegir un valor adecuado. –

+0

Supongo que es mejor probar 'map :: empty()' ¿no es así? –

-1

No debe intentar incrementar un iterador pasado, O DEREFERENCE un iterador a un mapa vacío, es por eso que debe tener sentencias if en su código para verificar el mapa y/o el iterador antes de usarlo.

+0

Una instrucción 'if' no es el único tipo de condicional, el' while' usado en la pregunta también funcionará bien. –

+0

Para el mapa vacío '' == end'. Entonces, el código no entrará mientras esté en bucle. Significa que no tendrás problemas con la desreferenciación del iterador. –

Cuestiones relacionadas