在我的一个项目中,我遇到了一种情况,我想在内存中创建对象索引。主索引可以使用不同的密钥,而辅助索引将使用一些其他元素作为密钥。
如果我将std::map
用于主索引
std::map<string, Object>
然后这是使用另一个容器存储二级索引的引用/指针的最佳方法(例如,考虑到所有对象都是唯一的std :: map),而不另外创建Object的副本< / em>的
使用会引发悬空指针或引用风险的原始指针或引用(我知道理想情况下,当Object从主索引中删除时,还应该注意将它从二级索引中删除但是指针/引用在辅助索引中,当主索引的容器在内部调整自身时无效?)
std::map<string, const Object*>
std::map<string, std::shared_ptr<Object>> // primary index
std::map<string, std::weak_ptr<Object>> // secondary index
我知道这两种方法都有利弊。特别是我不想失去直接在主容器中插入对象的灵活性,但我也不希望二级索引再次复制对象。仅仅为二级索引使用智能指针的困难在于它们不拥有对象。
提前感谢您的帮助。
答案 0 :(得分:1)
将对象放在某个容器中。根据对象的添加/删除频率,您可能需要考虑使用不会使对其元素的引用无效的容器,例如std::list
或std::deque
。
然后,对于您的地图,只需使用引用引用对象(或其任何成员),即使用std::reference_wrapper
。
封装后端存储以及索引,这样无论何时添加或删除对象,都会从索引中删除无效引用,并添加任何新引用。
这样你只需要存储一次你的对象并使用智能指针。这显然只有在你真正拥有对象并控制它们的生命周期时才能工作,并且如果你可以保持索引被封装(为了保持它们的更新)。