访问容器中的 unique_ptr 个元素
access unique_ptr elements in container
我有 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 的常见用法吗?如果不是最好的做法是什么?
我会建议一些方法。
第一种方法:
如果您确定映射中的所有对象都是非空的,那么获取指向对象的引用是一种完全有效的方法。
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>(...);
我有 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 的常见用法吗?如果不是最好的做法是什么?
我会建议一些方法。
第一种方法:
如果您确定映射中的所有对象都是非空的,那么获取指向对象的引用是一种完全有效的方法。
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>(...);