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

What's the best way of sharing object across containers?

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

std::map<string, Object>

然后 这是使用另一个容器为二级索引存储 reference/pointer 的最佳方式(再次 std::map 例如,考虑到所有对象都是唯一的)而不制作额外的副本对象?

我知道这两种方法各有利弊。尤其是我既不想失去直接在主容器中插入对象的灵活性,又不想二级索引再次复制对象。仅将智能指针用于二级索引的困难在于它们不会拥有对象。

在此先感谢您的帮助。

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

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

封装后端存储和索引,以便在添加或删除对象时从索引中删除无效引用并添加任何新引用。

这样您只需存储一次对象并使用智能指针四处走动。这显然只有在您实际拥有这些对象并控制它们的生命周期,并且您可以封装索引(以保持它们更新)时才有效。