it-swarm.com.de

C++ fügt unique_ptr in die Map ein

Ich habe ein C++ - Objekt vom Typ ObjectArray

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

Wie lautet die Syntax, um einen unique_ptr für ein neues Objekt vom Typ Class1 zu erstellen und in ein Objekt vom Typ ObjectArray einzufügen?

46
vigs1990

Als erste Bemerkung würde ich es nicht ObjectArray nennen, wenn es sich um eine Karte und nicht um ein Array handelt. 

Auf jeden Fall können Sie Objekte auf diese Weise einfügen:

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

Oder so:

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

Der Unterschied zwischen den beiden Formularen besteht darin, dass die erstere fehlschlägt, wenn der Schlüssel 0 bereits in der Karte vorhanden ist, während die zweite Form ihren Wert mit der neuen überschreibt.

In C++ 14 möchten Sie möglicherweise std::make_unique() verwenden, anstatt den unique_ptr aus einem new-Ausdruck zu konstruieren. Zum Beispiel:

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

Wenn Sie einen vorhandenen Zeiger hinzufügen möchten, der in die Map eingefügt werden soll, müssen Sie std :: move verwenden.

Zum Beispiel:

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

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

Zusätzlich zu den vorherigen Antworten wollte ich darauf hinweisen, dass es auch eine Methode emplace gibt (dies ist praktisch, wenn Sie keine Kopie erstellen können/wollen). Sie können sie also folgendermaßen schreiben:

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