【问题标题】:access unique_ptr elements in container [closed]访问容器中的 unique_ptr 元素 [关闭]
【发布时间】:2018-05-08 18:37:41
【问题描述】:

我有一个 unordered_map 的 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(myClass);

这似乎很昂贵,所以我想使用参考

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

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

【问题讨论】:

  • 引用有什么问题??请注意,您可以引用 unique_ptr 本身:auto&amp; ptr = Program::cache["my_class"];
  • 我认为没有人会考虑将std::unique_ptr 移动到昂贵的位置。考虑将const auto &amp; 引用到您的std::unique_ptr。它不允许您重新分配指针,但仍然允许您对元素进行可变访问。
  • 为什么不只是MyClass *ptr = Program::cache["my_class"].get();
  • 为什么要在地图中存储unique_ptrs,而不是MyClass 实例本身?

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


【解决方案1】:

我会建议一些方法。

第一种方法:

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

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

请注意,您使用 auto 的第二种方法会产生副本。

auto myClass = *Program::cach["my_class"]; // MyClass will be *copied* here

如果你不想要副本,你需要使用auto&amp;

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

如果您不需要可变访问,则使用 const 正确性

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

第二种方法:

如果地图中的条目可能为空,则使用第一种方法将不起作用,因为您可以取消引用空指针。

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

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

第三种方法:

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

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

【讨论】:

  • 第四个选项:将MyClass 对象直接存储在地图中,使用对这些对象的引用。可能是也可能不是一个有效的选择,但当我在这样的容器中看到unique_ptrs 时,我总是有点怀疑。
猜你喜欢
  • 2015-09-27
  • 2016-07-02
  • 2014-09-24
  • 1970-01-01
  • 1970-01-01
  • 2015-09-22
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多