2013-06-04 8 views
34

Ich habe ein C++ Objekt vom Typ ObjectArrayC++ Einfügen unique_ptr in der Karte

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

Was ist die Syntax ein unique_ptr auf ein neues Objekt des Typs zu schaffen Class1 und es in ein Objekt des ObjectArray Typs einfügen?

+0

Die folgende MSDN-Seite hat einige Informationen über diese: http://msdn.microsoft.com/en-us/library/vstudio/hh279676.aspx – yuyang

Antwort

47

Als erste Bemerkung würde ich es nicht ObjectArray nennen, wenn es eine Karte und kein Array ist.

Wie auch immer, 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 Formen ist, dass erstere wird scheitern, wenn der Schlüssel 0 bereits vorhanden ist in der Karte, während der zweite seinen Wert mit dem neuen überschreibt.

In C++ 14, möchten Sie möglicherweise std::make_unique() anstelle der unique_ptr aus einem new Ausdruck verwenden. Zum Beispiel:

myMap[0] = std::make_unique<Class1>(); 
+1

+1 auf Vollständigkeit und Klarheit. – taocp

+0

@milleniumbug: Guter Vorschlag, lass mich es zur Antwort hinzufügen. Danke –

+1

Eine andere Option ist das Mitglied von emplace: myMap.emplace (0, neue Class1). Nicht alle Bibliotheken unterstützen dieses Mitglied jedoch schon. –

34

Wenn Sie einen vorhandenen Zeiger zum Einfügen in die Karte hinzufügen möchten, müssen Sie std :: move verwenden.

Zum Beispiel:

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

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