c++ - 访问容器中的 unique_ptr 元素

标签 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 的常见用法吗?如果不是,最佳实践是什么?

最佳答案

我建议一些方法。

第一种方法:

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

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 正确性

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

关于c++ - 访问容器中的 unique_ptr 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47478481/

相关文章:

c++ - std::thread.join() 死锁

c++ - 首先调用虚拟基类构造函数,然后按顺序调用其他类的构造函数

c++ - C++ 11 原子对象的执行也是原子的吗?

C++ 内存缓存类

c++ - 将 String^ 转换为 std::string(基本字符串)-> 错误。我怎样才能解决这个问题?

c++ - 如何将类方法作为参数传递给另一个函数并稍后调用它,最好使变量类方法签名显式?

c++ - 拆分读取文件 C++

c++ - 无法分配给链表中的对象

c++ - 返回对内部对象的引用时的常量性

c++ - find() 无法识别我的自定义迭代器