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

C++ 什么';跨容器共享对象的最佳方式是什么?,c++,pointers,c++11,smart-pointers,C++,Pointers,C++11,Smart Pointers,在我的一个项目中,我遇到了一种情况,我想创建对象的内存索引。主索引可以使用不同的键,次索引将使用一些其他元素作为键。 如果我使用std::map作为主索引 std::map<string, Object> std::map 那么,使用另一个容器(例如std::map,考虑到所有对象都是唯一的)存储二级索引的引用/指针而不创建对象的其他副本的最佳方法是什么 使用原始指针或引用会造成指针或引用悬空的风险(我知道,理想情况下,当对象从主索引中删除时,也应该注意将其从次索引中删除,但当

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

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

  • 使用原始指针或引用会造成指针或引用悬空的风险(我知道,理想情况下,当对象从主索引中删除时,也应该注意将其从次索引中删除,但当主索引的容器内部调整时,次索引中的指针/引用会失效吗?)

    std::map

  • 或者使用主索引中的共享_ptr和弱_ptr的二级索引的组合
    std::map//主索引
    标准::地图//二级索引
我知道这两种方法都有利弊。特别是我不想失去在主容器中直接插入对象的灵活性,但我也不希望次索引再次复制对象。仅为二级索引使用智能指针的困难在于它们不会拥有对象


提前感谢您的帮助。

将您的物品放在某个容器中。根据对象的添加/删除频率,您可能需要考虑使用一个容器,该容器不会对其元素的引用无效,如<代码> STD::列表< /C> >或<代码> STD::DeQue/Cuff.< /P> 然后,对于地图,只需使用引用引用对象(或其任何成员),即使用
std::reference\u wrapper

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


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

使用主键引用对象如何<代码>标准::映射//二级索引,值为主键。这样做的缺点是需要另一次地图查找才能获取对象:P可以是对对象的多步引用吗?成本几乎会翻倍。我建议使用智能指针指向对象。将指针放在
std::vector
中。接下来,使用指向对象的键和智能指针创建索引,例如
std::map
。@ChadwickRobbert:使用哈希映射,您仍然有固定成本。还有,你会注意到这个费用吗?更重要的是,一旦探查器说您花费了太多的时间进行这些查找,是否很容易更改为采用某些快捷方式的其他解决方案?可能