2016-10-12 56 views
8

在我的C++應用程序中,我遇到了一個問題,需要關聯3件事物並查找它們或遍歷任意一列。在C++中關聯3件事的最佳方式

比方說,我有3個類A,B,C和一個A可能是B/C對的兩個或三個組合。我希望能夠找到與Bs相關的所有As,每個A的所有BC對,或者給定的A和C的每個B.對於給定的A和C,除了具有std :: tuple的向量之外,這對我並不明顯併線性迭代整個列表,但我寧願有像訪問哈希表。我想到的另一種方法就是製作A -> vector<pair<B,C>>B -> vector<pair<A,C>這樣的多個散列表,但這似乎讓人很頭疼。

+5

這可能有用:http://www.boost.org/doc/libs/1_62_0/libs/multi_index/doc/index.html –

+0

謝謝!可能!也許你可以加上這個答案;) – Steve

回答

2

我已經編寫了代碼來解決一個潛在的類似的問題,我做了這樣的工作,迄今爲止(迄今)。

在某些類:

你可以存儲tuplevector一個像是:

vector<tuple<A, B, C>> tuple_array; 

而對於散列訪問,簡單地指向元組指數如地圖:

map<A, size_t> a_mapping; 
map<B, size_t> b_mapping; 
map<C, size_t> c_mapping; 

在類的構造函數中,您可以相當簡單地派生映射。這是假設A s,B s和C s可以排序或哈希。

有了這個數據結構,您可以在該類上編寫任何您需要的查詢方法,並且實現應該總是非常簡單快捷。

將新元素添加到元組數組很簡單。映射本質上只是允許快速查找的緩存。如果一個實例ABC可能位於多個元組中,則可能必須映射到vectorsize_t

在本設計中添加D也是相當直接的。

如果您需要某些關係而沒有其中一個類別,您可以用variant替代tuple

+0

對於獎勵積分,我想你可以將映射存儲在第二個元組中! – sji

+0

所有建議的解決方案都很好,但我最終或多或少都會沿着這些方向做些事情。謝謝! – Steve

0

您可以保留三元組的std::list。然後在列表的頂部添加三個std::unordered_map<std::reference_wrapper<>, std::list::iterator>

使用list而不是vector的好處是可以讓您有效地插入/刪除/更新集合。

使用std::reference_wrapper<>作爲關鍵的好處是,您不必重複存儲A/B/C值。使用list::iterator的好處是可以直接訪問三元組。另外,因爲list是基於指針的,所以在插入/刪除某些列表項後,其餘list::iterators保持有效。

2

Boost Multi-index Containers Library似乎非常接近你想要的。從簡介:

Boost多索引容器庫提供了一個名爲multi_index_container的類模板,它可以構建容器來維護具有不同排序和訪問語義的一個或多個索引。

。 。 。

Boost.MultiIndex的多功能特性允許指定多種不同的數據結構。以下是在文檔中使用開發的可能例子:

  • 設置與幾個迭代訂單和搜索條件。
  • 列表快速查找和/或沒有重複。
  • 雙向映射,即可以搜索鍵或值的映射。 MRU(最近使用的)列表,結構保留n個最後引用的項目,從最新的項目開始。
  • 利用Boost.MultiIndex提供的額外功能來仿真標準容器。
相關問題