mapa example ejemplo clase c++ dictionary default

c++ - example - map<int, int> valores por defecto



map find c++ (4)

La respuesta de Rep_Movsd está simplificada en exceso y es probable que conduzca a numerosos conceptos erróneos extremadamente peligrosos. Los tipos de datos primitivos en C ++ no tienen inicializadores. Louis Brandy tuvo una maravillosa charla en la que habló sobre muchos errores comunes de C ++ cometidos en Facebook y un malentendido de cómo funciona std :: map <> [] fue uno de los errores que comentó, este es un recurso excelente, aunque no lo hace. Entérese cómo funciona std :: map <> [].

En general, los ints no están inicializados y están indefinidos como todos los tipos primitivos. Dicho esto, cuando se usa con std :: map <> [], el int tiene un valor predeterminado de cero establecido a través de un proceso llamado inicialización de valores. La inicialización del valor es un proceso que realmente funciona con estructuras en general. Por ejemplo,

struct Struct { Struct() : memberVariable() {} int memberVariable; };

Siempre inicializará el int a cero. Si las variables miembro fueran otros tipos primitivos, también tendrían valores de inicialización específicos. Por ejemplo, los siguientes tipos se inicializan, a través de la inicialización de valores de esta manera:

bool = falso
float = 0.0f
enumeración = (tipo de enumeración) 0
puntero = puntero nulo
puntero a miembro = puntero miembro nulo

Tenga mucho cuidado cuando trabaje con datos que no están inicializados explícitamente. Una última cosa, considere el siguiente código

map<string, int> myMap; cout << myMap["Foo"];

Este código no solo siempre inicializará el número entero a 0, sino que también insertará 0 en el mapa. Solo para recapitular rápidamente, los tipos de datos primitivos no están definidos si no se inicializan, pero en algunos casos, como con una estructura o inicialización de valores de mapa, se inicializarán los datos primitivos con un valor específico.

std::map<int,int> mapy; ++mapy[5];

¿Es seguro asumir que mapy[5] siempre será 1? Quiero decir, mapy[5] siempre obtendrá el valor predeterminado de 0 antes de ''++'', incluso si no se declara explícitamente, como en mi código?


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 que tenga un constructor predeterminado diferente.


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


Sí, es seguro asumir.

El operator[] del mapa operator[] se especifica así: ([map.access])

Efectos: Si no hay una clave equivalente a x en el mapa, inserta value_type(std::move(x), T()) en el mapa.
Devoluciones: Una referencia al tipo mapped_type correspondiente a x en *this .

T() utiliza la inicialización de valores para todas las T excepto void ([expr.type.conv] / 2) , y la inicialización de valores para una primitiva produce una inicialización de cero ([dcl.init] / 7) .

Por lo tanto, la expresión se evalúa como una referencia a un objeto con valor cero ([dcl.init] / 5) .

La llamada del operator++ luego incrementa ese objeto a uno, y evalúa a uno.

(Todas las referencias son C ++ 11.)