initialise la valeur std :: map quand sa clé n’existe pas

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 class Value { //.. int some_member; //is used for any purpose that you like std::vector some_container; public: Value(int some_member_) : some_member(some_member_) { std::cout << "Hello from the one-argument constructor" << std::endl; } Value() { std::cout << "Hello from the no argument constructor" << std::endl; } void add(int v) { some_container.push_back(v); } int getContainerSize() { return some_container.size(); } //... }; //and somewhere in the code: class A { public: std::map myMap; void some_other_add(int j, int k) { myMap[j].add(k); } int getsize(int j) { return myMap[j].getContainerSize(); } }; //and the program actually works int main() { A a; std::cout << "Size of container in key 2 = " << a.getsize(2) << std::endl; a.some_other_add(2, 300); std::cout << "New Size of container in key 2 = " << a.getsize(2) << std::endl; return 1; } 

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ère value_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ère value_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.

C ++ 03

 std::map::iterator i = myMap.find(j); if (i == myMap.end()) i = myMap.insert(std::map::value_type(j, 123)).first; i->add(k); 

C ++ 11

 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.