2010-04-19 13 views
42
std::map<int,int> mapy; 
++mapy[5]; 

¿Es seguro asumir que mapy[5] siempre será 1? Quiero decir, ¿obtendrá mapy[5] siempre el valor predeterminado de 0 antes de '++', incluso si no está explícitamente declarado, como en mi código?map <int,int> valores predeterminados

+2

Posible duplicado del valor predeterminado de [std :: map para el tipo de compilación] (http://stackoverflow.com/questions/4523959/stdmap-default-value-for-build-in-type) – bobobobo

+2

@bobobobo: esta pregunta es anterior a [valor predeterminado de std :: map para el tipo de compilación] (http://stackoverflow.com/questions/4523959/ stdmap-default-value-for-build-in-type), luego el duplicado debe ser [std :: map valor predeterminado para el tipo incorporado] (http://stackoverflow.com/questions/4523959/stdmap-default -value-for-build-in-type). – mpromonet

Respuesta

66

Tan pronto como acceda al mapa con el operador [], si la clave no existe, se agrega. Se invoca el inicializador predeterminado del tipo int, por lo que obtendrá un valor de 0.

+0

Hasta donde he experimentado, el valor inicial de un 'prim' primitivo no inicializado es _undefined_ - es decir, puede ser 0, o puede ser -99765521. ¿Alguna vez tuviste un 'int' no inicializado como variable de clase y uno de esos valores absurdos apareció en tu programa? Dicho esto, probé esto y parece funcionar. '#include #include usando namespace std; int main() { map m; para (int i = 0; i <100; i ++) m [i] ++; para (const pair & p: m) printf ("m [% d] =>% d \ n", p.first, p.second); } ' – bobobobo

+14

Funciona de una manera diferente a lo que piensas. int x; hace que x obtenga un valor indefinido int x = int(); De nuevo x obtiene 0 clase foo {int x; foo(): x() {}}; foo f; Aquí f.x será cero –

7

Sí, el valor predeterminado será el predeterminado de ese tipo. Si desea otro valor predeterminado, puede crear una clase que se comporte como un int pero tenga un constructor predeterminado diferente.

Cuestiones relacionadas