2010-09-25 56 views
1

我需要使用多個鍵(int類型)來存儲和檢索哈希表中的單個值。我會使用多個鍵索引單個項目。我需要快速插入並查找散列表。順便說一句,我不允許在實現中使用Boost庫。多鍵哈希表(unordered_map)

我該怎麼做?

謝謝。

+0

當你說多個鍵時,你的意思是每個鍵都必須單獨索引相同的項目,還是你的意思是多個整數都用於索引單個項目? (也就是說,當你做查找時,你是否提供了一個或所有的多個密鑰?) – 2010-09-25 17:41:12

+0

感謝您的快速回復。我會使用多個鍵索引單個項目。 – Ashley 2010-09-25 17:47:04

回答

1

最簡單的方法可能是保留指向列表中元素的指針/索引映射。

雖然需要一些更多細節,但是您需要支持刪除嗎?元素如何設置?你可以使用boost :: shared指針嗎? (相當有幫助,如果你需要支持刪除)

我假設在這種情況下值對象很大,或者有一些其他原因,你不能簡單地複製常規地圖中的值。

2

如果你的意思是兩個整數形成一個單一的密鑰,然後unordered_map<std::pair<int,int>, value_type>。如果您想通過多個鍵索引相同的一組數據,請查看Boost.MultiIndex

+0

這不起作用。我試過了。它說:散列並不專門用於這種類型 – off99555 2016-04-04 08:38:53

+0

@ off99555如果你定義了一個自定義散列函數,它將起作用。請參閱,例如,http://stackoverflow.com/questions/17016175/c-unordered-map-using-a-custom-class-type-as-the-key – orizon 2016-07-01 20:47:15

2

如果關鍵看你的容器由多個int S上的結合,你可以使用boost::tuple作爲你的鑰匙,而不需要您更多的工作來封裝int秒。如果您的密鑰int子組件的數量已修復,則此項保持不變。

+0

感謝您的回覆。我更新了關於我不允許使用Boost庫的問題。 – Ashley 2010-09-25 17:51:26

+0

@Ashley - 爲什麼不呢?如果沒有Boost,你就不能隨時訪問unordered_map。 – 2010-09-25 17:54:00

+0

我認爲我目前可以訪問的unordered_map是GNU C++庫的實現。 – Ashley 2010-09-25 18:00:51

0

如果它總是用於檢索的組合。

然後它更好地使用多個密鑰形成單個複合密鑰。

你可以做到這一點無論

  1. 保存像是

    (int1,int2,int3) => data 
    
  2. 的關鍵是整數的一個連接字符串使用像uint64_t中更高的數據類型,其中以U可以添加單獨的值以形成一把鑰匙

    // Refer comment below for the approach 
    
+0

方法#2很好,更好的解釋請參見http://stackoverflow.com/questions/3761914/storing-and-retrieving-multiple-keys-in-c/3762694#3762694;公式似乎是不正確的,它可能是(假設'N'是以位爲單位的int寬度):'((int1 << 2 * N)+(int2 << N)+ int3)'提供的'數據' 3 * N'位。 – Arun 2010-09-25 19:50:24