C++ invoegen unique_ptr in kaart

Ik heb een C++-object van het type ObjectArray

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

Wat is de syntaxis om een ​​unique_ptrte maken voor een nieuw object van het type Class1en dit in te voegen in een object van het type ObjectArray?


Antwoord 1, autoriteit 100%

Als eerste opmerking zou ik het geen ObjectArraynoemen als het een kaart is en geen array.

Hoe dan ook, je kunt objecten op deze manier invoegen:

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

Of op deze manier:

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

Het verschil tussen de twee vormen is dat de eerste zal mislukken als de sleutel 0al aanwezig is op de kaart, terwijl de tweede zijn waarde zal overschrijven met de nieuwe.

In C++14 wil je misschien std::make_unique()in plaats van de unique_ptrte construeren uit een newexpressie. Bijvoorbeeld:

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

Antwoord 2, autoriteit 77%

Als je een bestaande aanwijzer wilt toevoegen om in de kaart in te voegen, moet je std::move gebruiken.

Bijvoorbeeld:

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

Antwoord 3, autoriteit 6%

Naast eerdere antwoorden wil ik je erop wijzen dat er ook een methode is emplace(handig als je geen kopie kunt/wil maken), zodat je die kunt schrijven zoals dit:

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>(...));

Other episodes