C ++中的内存高效双向映射

时间:2015-02-12 21:09:44

标签: c++ dictionary two-way

我需要创建从int到对象的双向映射。我无法使用boost::bimap,因为我的对象在放入映射后会被修改(它们会以不影响映射的方式进行修改)。

简单的解决方案是使用vectorunordered_map

vector<MyClass> _vector;
unordered_map<MyClass, size_t> _map;

但是,这会保留每个MyClass的两个副本,我不希望这样。

我可以在其中一个容器中保留MyClass *个指针,并使用另一个容器的存储空间,但我担心vectorunordered_map可以移动实例(重新分配向量或调整哈希表大小时)。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:1)

你不能只将对象存储在一个向量中并将映射的索引保存在另一个向量中吗?

std::vector<MyClass> vC;
std::vector<unsigned int> vM;

然后vC[vM[i]]vC[i]对象的映射类。

虽然如果你提供更多关于你要做什么的细节(地图是反射的吗?所有类都有一个映射类或只有一些?你需要多久修改一下你的对象?)我们可以帮助更多。< / p>

答案 1 :(得分:0)

您可以在主容器中使用std::shared_ptr<MyClass>,在引用容器中使用std::weak_ptr<MyClass>

不幸的是,您没有提供足够的背景或要求,为您提供简明的示例。无论如何,您还应该进行一些同步管理,从主容器中删除这些条目,从参考容器中删除条目,尽管std::weak_ptr使这更容易实现。

这不仅可以提高内存效率,还可以使您无法保持MyClass的其他无关副本同步。