6
votes

std :: map Initialisation par défaut de la valeur

Ce code semble bien fonctionner, avec la valeur par défaut pour les value_type ( int ) comme 0; Cela fonctionne-t-il pour tous les cas? XXX

Qu'en est-il du double? carte? Par défaut 0,0?


2 commentaires

Je ne peux pas comprendre ce que vous demandez réellement. Pouvez-vous rehrasser?


Désolé pour la confusion. Les réponses ci-dessous sont très utiles.


3 Réponses :


8
votes

Oui. Lorsque vous utilisez le [] -Opérator sur une carte et aucun élément avec la clé souhaité n'existe, un nouvel élément est inséré qui est initialisé de la valeur. Pour un entier, cela signifie initialisé à zéro.


0 commentaires

8
votes

Oui, ce code fonctionnerait pour tout type de clé, y compris double . La raison pour laquelle cela fonctionne est que l'opérateur non-const [] renvoie une référence à la valeur de la clé, pas une copie de cette valeur. C'est cette référence à laquelle l'opérateur ++ est appliqué.

Le fragment de code que vous montrez fonctionne comme suit:

  • pour chaque clé t de type chaîne dans le conteneur str ,
  • La carte w est recherchée sur la touche donnée
  • Depuis que l'entrée n'est pas là, un nouveau est inséré dans la carte
  • car la clé de l'entrée est connue, mais la valeur n'est pas, une valeur par défaut ( initialisée de valeur-initialisée , EI 0 pour int ) objet pour la valeur est créée
  • Une référence à l'objet nouvellement créé (dans ce cas, int & initialisé à zéro) est renvoyé à l'appelant
  • L'opérateur ++ est appliqué à la référence renvoyée à partir du [] , qui change 0 sur 1 (ou 0.0 à 1.0 , etc.)

4 commentaires

Merci pour l'explication! Très utile!


Je vois. Merci. C'est en fait ma première question sur Stackoverflow.


@dasblinkenlight Un objet par défaut pour la valeur est créé , pourriez-vous expliquer, pourquoi INT est initialisé à 0? AFAIC, "constructeur" par défaut pour int ne spécifie pas de valeur particulière et la valeur prévue d'être indéfinie


@Alexey Il est important de distinguer entre l'initialisation par défaut et l'initialisation de la valeur pour un int . Si vous écrivez int x; thun x est initialisé par défaut, lequel pour int signifie "Aucune initialisation n'est effectuée", car c'est un type de pod . Si vous écrivez int x = int () , quel est ce que les conteneurs font (sauf que c'est t x = t () pour les conteneurs, car ils sont des modèles) alors x est initialisé en integer zéro.



2
votes

fonctionne-t-il pour tous les cas?

Pour tous les cas, une nouvelle clé sera associée à une valeur initialisée à t () .

Quand t est un intégré ou Données anciennes simples Tapez, tels que int ou double , qui évalue à zéro.

Lorsque t est une classe, la carte tentera d'appeler le constructeur vide.


1 commentaires

Si cette classe a un constructeur par défaut. Sinon, cela ne parviendra pas à compiler.