假设我有两种类型的ID,entityID
和linkID
。
这些用于指代不同类型的对象,ID本身具有不同(不可转换)类型*。每个ID在其类型中都是唯一的。
每个Entity
对应于存储在其他地方的Link
。因此,我希望能够基于另一个访问一个。为此,我希望能够从一种ID类型转换为另一种ID类型。
我通常如何关联两个不同类型,例如std::map<id, value>
。但是,这限制了key
的搜索,因此只允许单向转换。
我能做的是创建一个std::set<std::pair<entityID, linkID>>
。这样可确保在entityID
搜索时从linkID
快速转换为std::pair::first
,并在std::pair::second
使用std::find_if
进行搜索时有合理的时间。
同样,这似乎不是一个干净的解决方案,对于阅读代码的任何人来说都不是显而易见的。虽然,据我所知,将容器按两个键分类是不可能的,但我想知道是否有一种更方便的方式来存储这种关系。
*如果重要,则ID的类型为unsigned short
和struct{unsigned int, unsigned short}
。
修改 <{3}}在评论中提到的boost::bimap就是我所寻找的。 p>
答案 0 :(得分:1)
如果我清楚地理解了您的要求,那么您希望拥有一对entityID和linkID。除此之外,您还希望有一些基于entityID和linkID的快速搜索算法。
有3个解决方案:
1)使用2个地图,其中一个以entityID作为密钥,另一个以linkID作为密钥。
2)使用多键映射,例如来自Boost Multi-Index库http://www.boost.org/doc/libs/1_46_1/libs/multi_index/doc/index.html
的映射3)使用Boost :: Bimap代表双向地图。 http://www.boost.org/doc/libs/1_55_0/libs/bimap/doc/html/index.html
如果它无法解决您的问题,请告诉我。