C++ 中内存高效的双向映射
Memory-efficient two-way-mapping in C++
我需要创建一个从整数到对象的双向映射。我不能使用 boost::bimap
,因为我的对象在放置在映射中后被修改(它们正在以不影响映射的方式修改)。
简单的解决方案是两个使用 vector
和 unordered_map
:
vector<MyClass> _vector;
unordered_map<MyClass, size_t> _map;
但是,这会维护每个 MyClass
的两个副本,我不希望这样。
我可以在一个容器中保留 MyClass *
指针,并使用另一个容器的存储,但我担心 vector
或 unordered_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 或者只有一些?你需要多久修改一次你的对象?)我们可以提供更多帮助。
我需要创建一个从整数到对象的双向映射。我不能使用 boost::bimap
,因为我的对象在放置在映射中后被修改(它们正在以不影响映射的方式修改)。
简单的解决方案是两个使用 vector
和 unordered_map
:
vector<MyClass> _vector;
unordered_map<MyClass, size_t> _map;
但是,这会维护每个 MyClass
的两个副本,我不希望这样。
我可以在一个容器中保留 MyClass *
指针,并使用另一个容器的存储,但我担心 vector
或 unordered_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 或者只有一些?你需要多久修改一次你的对象?)我们可以提供更多帮助。