2013-06-04 14 views
34

Mam C++ obiektu typu ObjectArrayC++ wstawienie unique_ptr na mapie

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

Jaka jest składnia stworzyć unique_ptr do nowego obiektu typu Class1 i włóż ją do obiektu typu ObjectArray?

+0

Poniższa strona MSDN ma jakieś informacje na ten temat: http://msdn.microsoft.com/en-us/library/vstudio/hh279676.aspx – yuyang

Odpowiedz

47

Jako pierwsza uwaga, nie nazwałbym tego ObjectArray, jeśli jest to mapa, a nie tablica.

W każdym razie, można wstawiać obiekty w ten sposób:

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

Or w ten sposób:

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

Różnica między tymi dwoma postaciami jest to, że były nie powiedzie się, jeśli klawisz 0 jest już obecny na mapie, podczas gdy druga nadpisze jej wartość na nową.

W C++ 14 można użyć std::make_unique() zamiast tworzyć unique_ptr z wyrażenia new. Na przykład:

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

+1 do kompletności i przejrzystość. – taocp

+0

@milleniumbug: Dobra sugestia, pozwól mi dodać ją do odpowiedzi. Dziękujemy –

+1

Inną opcją jest członek emplace: myMap.emplace (0, nowa klasa1). Jednak nie wszystkie biblioteki obsługują tego członka. –

34

Jeśli chcesz dodać istniejący wskaźnik do wstawienia na mapę, będziesz musiał użyć std :: ruch.

Na przykład:

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

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