web-dev-qa-db-fra.com

C++ insérant unique_ptr dans la carte

J'ai un objet C++ de type ObjectArray

typedef map<int64_t, std::unique_ptr<Class1>> ObjectArray;

Quelle est la syntaxe pour créer un unique_ptr dans un nouvel objet de type Class1 et l'insérer dans un objet de type ObjectArray?

46
vigs1990

Comme première remarque, je ne l'appellerais pas ObjectArray s'il s'agit d'une carte et non d'un tableau. 

Quoi qu'il en soit, vous pouvez insérer des objets de cette façon:

ObjectArray myMap;
myMap.insert(std::make_pair(0, std::unique_ptr<Class1>(new Class1())));

Ou de cette façon:

ObjectArray myMap;
myMap[0] = std::unique_ptr<Class1>(new Class1());

La différence entre les deux formes est que le premier échouera si la clé 0 est déjà présente dans la carte, tandis que la seconde remplacera sa valeur par la nouvelle.

En C++ 14, vous voudrez peut-être utiliser std::make_unique() au lieu de construire le unique_ptr à partir d'une expression new. Par exemple:

myMap[0] = std::make_unique<Class1>();
63
Andy Prowl

Si vous voulez ajouter un pointeur existant à insérer dans la carte, vous devrez utiliser std :: move.

Par exemple:

std::unique_ptr<Class1> classPtr(new Class1);

myMap.insert(std::make_pair(0,std::move(classPtr)));
46
Saurabh

En plus des réponses précédentes, je voulais souligner qu’il existe également une méthode emplace (pratique lorsque vous ne pouvez pas/ne voulez pas faire de copie).

ObjectArray object_array;
auto pointer = std::make_unique<Class1>(...);  // since C++14
object_array.emplace(239LL, std::move(pointer));
// You can also inline unique pointer:
object_array.emplace(30LL, std::make_unique<Class1>(...));
0
antonpp