C++ 访问容器中的唯一\u ptr元素

C++ 访问容器中的唯一\u ptr元素,c++,c++11,std,unique-ptr,C++,C++11,Std,Unique Ptr,我有一张独特元素的无序地图。当我想要访问这些元素时,我必须移动它们,并在使用完它们后将它们插回原处 std::unordered_map<std::string,std::unique_ptr<MyClass>> auto myClass = std::move(Program::cache["my_class"]); // do something with myClass... Program::cache["my_class"] = std::move(myCla

我有一张独特元素的无序地图。当我想要访问这些元素时,我必须移动它们,并在使用完它们后将它们插回原处

std::unordered_map<std::string,std::unique_ptr<MyClass>>

auto myClass = std::move(Program::cache["my_class"]);
// do something with myClass...
Program::cache["my_class"] = std::move(myClass);

但这似乎不自然。这是容器和唯一ptr的常见用法吗?如果不是,最好的做法是什么

我想提出一些方法

第一次进近:

如果您确定贴图中的所有对象都是非空的,那么获取指向对象的引用是一种非常有效的方法

MyClass const& myClass = *Program::cache["my_class"];
请注意,第二种方法是使用
auto
,会产生一个副本

auto myClass = *Program::cach["my_class"]; // MyClass will be *copied* here
如果您不需要副本,则需要使用
auto&

auto& myClass = *Program::cach["my_class"]; // you have a mutable reference
如果您不需要可变访问,那么使用常量正确性

const auto& myClass = *Program::cach["my_class"]; // you have a const reference
第二种方法:

如果映射中的条目可能为null,那么使用第一种方法将不起作用,因为您可能会取消对null指针的引用

<>在现代C++生根指针中表示非拥有关系,因此使用<代码> xxx .GETE()/Cuffe >从<代码>原始字符指针中获得原始指针< /COD> < /P>
MyClass* myClass = Program::cache["my_class"].get();
if (myClass)
    ...
第三种方法:

获取对
唯一\u ptr
本身的引用,以便在需要更改其指向的对象时为其指定值

std::unique_ptr<MyClass>& myClass = Program::cache["my_class"];
if (!myClass)
    myClass = std::make_unique<MyClass>(...);
std::unique_ptr&myClass=Program::cache[“我的类”];
如果(!myClass)
myClass=std::使_唯一(…);

引用有什么问题??注意:您可以引用
unique\u ptr
本身:
auto&ptr=Program::cache[“我的类”]我不认为任何人会考虑移动<代码> STD::UnQuyJPTR <代码>是昂贵的。考虑使用<代码> const Auto&参考您的代码> STD::UNQuYGYPTR < /代码>。它不允许您重新分配指针,并且仍然允许您对元素进行可变访问?为什么要在地图中存储
unique_ptr
s,而不是
MyClass
实例本身?第四个选项:直接在地图中存储
MyClass
对象,使用对这些对象的引用。可能是有效的选择,也可能不是有效的选择,但当我在这样的容器中看到
unique\u ptr
s时,我总是有点怀疑。
std::unique_ptr<MyClass>& myClass = Program::cache["my_class"];
if (!myClass)
    myClass = std::make_unique<MyClass>(...);