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

Memory-efficient two-way-mapping in C++

我需要创建一个从整数到对象的双向映射。我不能使用 boost::bimap,因为我的对象在放置在映射中后被修改(它们正在以不影响映射的方式修改)。

简单的解决方案是两个使用 vectorunordered_map:

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

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

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

如有任何帮助,我们将不胜感激。

您可以在引用中使用 std::shared_ptr<MyClass> in your main container, and std::weak_ptr<MyClass>

很遗憾,您没有提供足够的上下文或要求,无法给您一个简洁的示例。无论如何,你还应该有一些同步管理,从引用容器中删除条目,一旦从主容器中删除这些条目,尽管 std::weak_ptr 使这更容易实现。

这不仅可以提高内存效率,还可以让您免于保持同步 MyClass 的不相关副本。

您不能只将对象存储在一个向量中,而将映射索引保存在另一个向量中吗?

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

那么vC[vM[i]]就是vC[i]对象的映射class。

虽然如果你提供更多关于你正在尝试做的事情的细节(映射是自反的吗?所有 classes 都有一个映射 class 或者只有一些?你需要多久修改一次你的对象?)我们可以提供更多帮助。