web-dev-qa-db-ja.com

マップにunique_ptrを挿入するC ++

タイプObjectArrayのC++オブジェクトがあります

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

unique_ptr型の新しいオブジェクトにClass1を作成し、_ObjectArray型のオブジェクトに挿入する構文は何ですか?

52
vigs1990

最初の発言として、配列ではなくマップの場合、ObjectArrayとは呼びません。

とにかく、この方法でオブジェクトを挿入できます:

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

またはこの方法:

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

2つの形式の違いは、キー_0_がマップに既に存在する場合、前者は失敗しますが、2番目の形式はその値を新しい形式で上書きすることです。

C++ 14では、new式から_unique_ptr_を構築する代わりに、 std::make_unique() を使用できます。例えば:

_myMap[0] = std::make_unique<Class1>();
_
74
Andy Prowl

マップに挿入する既存のポインターを追加する場合は、std :: moveを使用する必要があります。

例えば:

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

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

以前の回答に加えて、メソッドemplace(コピーを作成できない/したくない場合に便利です)もあることを指摘したかったので、次のように記述できます。

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