访问容器中的unique_ptr元素

时间:2017-11-24 18:30:49

标签: c++ c++11 std unique-ptr

我有一个unique_ptr元素的unordered_map。当我想要访问元素时,我必须移动它们,并在我使用它们后将它们插回。

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

这似乎非常昂贵所以我想使用参考

MyClass const& myClass = *Program::cache["my_class"];
or
auto myClass = *Program::cach["my_class"];

但这似乎不自然。这是容器和unique_ptr的常见用法吗?如果不是最佳做法?

1 个答案:

答案 0 :(得分:3)

我建议采取一些方法。

第一种方法:

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

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 correctness

const auto& myClass = *Program::cach["my_class"]; // you have a const reference

第二种方法:

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

在现代C ++中,原始指针表示非拥有关系,因此使用xxx.get()unique_ptr获取原始指针

MyClass* myClass = Program::cache["my_class"].get();
if (myClass)
    ...

第3种方法:

获取对unique_ptr本身的引用,允许您在想要更改其指向的对象时为其指定值。

std::unique_ptr<MyClass>& myClass = Program::cache["my_class"];
if (!myClass)
    myClass = std::make_unique<MyClass>(...);