什么是跨容器共享对象的最佳方式?

时间:2016-03-23 23:19:02

标签: c++ pointers c++11 smart-pointers

在我的一个项目中,我遇到了一种情况,我想在内存中创建对象索引。主索引可以使用不同的密钥,而辅助索引将使用一些其他元素作为密钥。 如果我将std::map用于主索引

std::map<string, Object>

然后这是使用另一个容器存储二级索引的引用/指针的最佳方法(例如,考虑到所有对象都是唯一的std :: map),而不另外创建Object的副本< / em>的

  • 使用会引发悬空指针或引用风险的原始指针或引用(我知道理想情况下,当Object从主索引中删除时,还应该注意将它从二级索引中删除但是指针/引用在辅助索引中,当主索引的容器在内部调整自身时无效?)

    std::map<string, const Object*>

  • 或者在主索引和weak_ptr的二级索引中使用shared_ptr组合 std::map<string, std::shared_ptr<Object>> // primary index std::map<string, std::weak_ptr<Object>> // secondary index

我知道这两种方法都有利弊。特别是我不想失去直接在主容器中插入对象的灵活性,但我也不希望二级索引再次复制对象。仅仅为二级索引使用智能指针的困难在于它们不拥有对象。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

将对象放在某个容器中。根据对象的添加/删除频率,您可能需要考虑使用不会使对其元素的引用无效的容器,例如std::liststd::deque

然后,对于您的地图,只需使用引用引用对象(或其任何成员),即使用std::reference_wrapper

封装后端存储以及索引,这样无论何时添加或删除对象,都会从索引中删除无效引用,并添加任何新引用。

这样你只需要存储一次你的对象并使用智能指针。这显然只有在你真正拥有对象并控制它们的生命周期时才能工作,并且如果你可以保持索引被封装(为了保持它们的更新)。