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

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

在我的一个项目中,我遇到了一种情况,我想在内存中创建对象索引。主索引可以使用不同的键,辅助索引将使用一些其他元素作为键。 如果我使用 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::liststd::deque.

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

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

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

关于c++ - 跨容器共享对象的最佳方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36190525/

相关文章:

linux - C++/Linux : Using c++11 atomic to avoid partial read on dual-mapped mmap region

c++ - 修复基于模块的库中的自阻塞包含

c++ - 指向结构/类的递归成员的可变指针序列作为模板参数

c++ - std::multimap 获取两个范围

c++ - 按键的绝对值排序 std::map

c++ - 通过其索引获取(真实)监视器的句柄

c++ - 在 C++ 中通过引用传递指针

c - 从 C 中的列表中删除

用于分离辅助监视器的 C++ 应用程序

c - C 中函数调用指针的问题