2014-07-01 44 views
1

说我有两种类型的ID,entityIDlinkID关联两个独立密钥

这些用于引用不同类型的对象,并且ID本身具有不同(不可转换)类型*。每个ID在其类型中都是唯一的。

每个Entity对应于存储在别处的Link。因此,我希望能够访问另一个基于另一个。要做到这一点,我希望能够从一个ID类型转换到另一个。

我通常会将两种不同类型关联起来,例如std::map<id, value>。但是,这限制了搜索到key,因此只允许单向转换。

我可以做的是创建一个std::set<std::pair<entityID, linkID>>。这确保了当通过std::pair::first进行搜索时,从entityIDlinkID的快速转换,以及通过std::pair::second使用std::find_if进行搜索时具有合理的时间。

同样,这似乎并不是一个干净的解决方案,对于任何阅读代码的人都不明显。虽然,据我了解,这是不可能有一个容器按两个键排序,我想知道是否有一个更方便的方式来存储这种关系。


*如果它的事项,该类型的ID是unsigned shortstruct{unsigned int, unsigned short}


编辑 在评论中提到通过sharthboost::bimap就是我一直在寻找。

+1

['boost :: bimap'](http://www.boost.org/doc/libs/1_55_0/libs/bimap/doc/html/index.html)是一个很好的解决方案。 –

+0

@sharth的确如此,我正在寻找。不过,我的词汇无法产生合适的谷歌搜索。 ;) – nwn

回答

1

如果我已经明确了解您的要求,那么您希望有一对entityID和linkID。除此之外,您还希望有一些基于entityID和linkID的快速搜索算法。

有3个解决方案,以这样的:

1)使用2个映射一个与ENTITYID关键和其他与的linkID关键。

2)使用多键映射像一个从升压多指标库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

请让我知道如果它不能解决您的问题。

+0

是的! 'boost :: bimap'确实符合我想要做的。如果可能的话,我想使用STL,但是。你能解释你的第一个解决方案如何工作?另外,如果可以的话,随意编辑问题以使其更一般/更清晰。 – nwn