J’ai lu ici que l’opérateur std :: map [] crée un object si la clé n’existe pas !
Tout d’abord, puis-je savoir où je peux trouver une référence pour cette revendication? (Même si je sais que c’est vrai)
Ensuite, imaginons l’extrait de code suivant:
#include #include #include
sortie:
Hello from the no argument constructor Size of container in key 2 = 0 New Size of container in key 2 = 1
La sortie ci-dessus montre que le constructeur sans argument est appelé.
Ma question est la suivante: existe-t-il un moyen d’invoquer le constructeur à un argument des valeurs de map?
Je vous remercie
puis-je savoir où je peux trouver une référence pour cette revendication?
C’est ce que prévoit la norme C ++ 11. Selon le paragraphe 23.4.4.3:
T& operator[](const key_type& x);
1 Effets : S’il n’y a pas de clé équivalente à
x
dans la carte, insèrevalue_type(x, T())
dans la carte.[…]
T& operator[](key_type&& x);
5 Effets : S’il n’y a pas de clé équivalente à
x
dans la carte, insèrevalue_type(std::move(x), T())
dans la carte.
Concernant la deuxième question:
Existe-t-il un moyen d’invoquer le constructeur à un argument des valeurs de map?
Vous pouvez le faire en C ++ 03:
void some_other_add(int j, int k) { myMap.insert(std::make_pair(j, Value(k))); }
Et utilisez la fonction membre emplace()
dans C ++ 11:
myMap.emplace(j, k);
Vous trouverez une description utile de std::map<…>::operator[]
à l’ adresse cppreference.com .
Je suppose que vous souhaitez append une valeur de manière conditionnelle à l’aide d’un constructeur autre que celui par défaut, c’est-à-dire lorsque la clé correspondante n’est pas présente dans la carte.
std::map::iterator i = myMap.find(j); if (i == myMap.end()) i = myMap.insert(std::map::value_type(j, 123)).first; i->add(k);
auto i = myMap.find(j); if (i == myMap.end()) i = myMap.emplace(j, 123).first; i->add(k);
Dans les deux cas, Value_ nouvellement inséré aura some_member == 123.