Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;在地图中插入唯一的\u ptr 我有C++对象,类型 ObjeTrace> < typedef map<int64_t, std::unique_ptr<Class1>> ObjectArray; typedef映射ObjectArray;_C++_Pointers_Map_Stl_Unique Ptr - Fatal编程技术网

C++;在地图中插入唯一的\u ptr 我有C++对象,类型 ObjeTrace> < typedef map<int64_t, std::unique_ptr<Class1>> ObjectArray; typedef映射ObjectArray;

C++;在地图中插入唯一的\u ptr 我有C++对象,类型 ObjeTrace> < typedef map<int64_t, std::unique_ptr<Class1>> ObjectArray; typedef映射ObjectArray;,c++,pointers,map,stl,unique-ptr,C++,Pointers,Map,Stl,Unique Ptr,为Class1类型的新对象创建一个唯一的\u ptr,并将其插入ObjectArray类型的对象中的语法是什么?第一句话,如果它是一个映射而不是数组,我不会称它为ObjectArray 无论如何,可以通过以下方式插入对象: ObjectArray myMap; myMap.insert(std::make_pair(0, std::unique_ptr<Class1>(new Class1()))); ObjectArray myMap; myMap[0] = std::uniqu

Class1
类型的新对象创建一个
唯一的\u ptr
,并将其插入
ObjectArray
类型的对象中的语法是什么?

第一句话,如果它是一个映射而不是数组,我不会称它为
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());

如果要添加现有指针以插入到映射中,则必须使用std::move

例如:

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

myMap.insert(std::make_pair(0,std::move(classPtr)));
std::unique_ptr classPtr(新类别1);
插入(std::make_pair(0,std::move(classPtr));

除了前面的答案,我想指出还有一种方法
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>(...));
ObjectArray对象\u数组;
自动指针=标准::使_唯一(…);//从C++14开始
object_array.emplace(239LL,std::move(指针));
//您还可以内联唯一指针:
object_array.emplace(30LL,std::make_unique(…);

以下MSDN页面提供了一些相关信息:另一个选项是emplace成员:myMap.emplace(0,新类别1)。并非所有的图书馆都支持这个成员,但是,“千年虫”我确信这不是合法的C++。问题是,
insert
的右值引用重载是一个函数模板,但括号内的初始值设定项没有提供足够的信息来推断模板参数。@GeoffRomer:有一个
insert
重载,它采用了一个
常量值\u type&value
(中的第一个重载)。@AndyProwl,但是该重载要求value_type是可复制的,在本例中不是。@wgoody,如果您是指unique_ptr的复制构造函数,则不会,它将调用move赋值运算符。另外:myMap.insert({0,std::move(classPtr)});应该工作;谢谢你指出这一点。。我正在努力将一个现有的指针推到地图上,差点退出,只是向下滚动查看你的答案。。释然的难道不
安置
只需执行与
插入(移动())
相同的操作吗?
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>(...));