2014-07-01 76 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