在我的一个项目中,我遇到了一种情况,我想在内存中创建对象索引。主索引可以使用不同的键,辅助索引将使用一些其他元素作为键。
如果我使用 std::map
主索引为
std::map<string, Object>
那么 哪种方法是使用另一个容器存储二级索引的引用/指针的最佳方式(考虑到所有对象都是唯一的,例如 std::map)而无需创建对象的额外拷贝?
使用会带来悬挂指针或引用风险的原始指针或引用(我知道理想情况下,当对象从主索引中删除时,还应注意将其从二级索引中删除,但指针/引用会当主索引的容器在内部调整自身时,二级索引中的无效?)
std::map<string, const Object*>
- 或者结合使用主索引中的 shared_ptr 和辅助索引中的 weak_ptr
std::map<string, std::shared_ptr<Object>> // primary index std::map<string, std::weak_ptr<Object>> // secondary index
我知道这两种方法各有利弊。尤其是我既不想失去直接在主容器中插入对象的灵 active ,又不想二级索引再次复制对象。仅将智能指针用于二级索引的困难在于它们不会拥有对象。
在此先感谢您的帮助。
最佳答案
将您的对象放在某个容器中。根据添加/删除对象的频率,您可能需要考虑使用不会使对其元素的引用无效的容器,例如 std::list
或 std::deque
.
然后,对于您的 map ,只需使用引用来引用对象(或其任何成员),即使用 std::reference_wrapper
。
封装后端存储和索引,以便无论何时添加或删除对象,都可以从索引中删除无效引用并添加任何新引用。
这样一来,您只需存储一次对象并使用智能指针四处走动。这显然只有在您实际拥有这些对象并控制它们的生命周期,并且您可以保持索引封装(以便使它们保持更新)的情况下才有效。
关于c++ - 跨容器共享对象的最佳方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36190525/