2

我需要爲散列表提供插入/查找/刪除接口。我只寫了散列表來提供內部存儲桶/入口管理。散列函數應該從外部提供。我現在堅持如何公開接口,以便哈希表可以處理字節數組以及固定長度的數據類型。問題在於,對於字節數組,哈希函數需要知道數組的長度,而對於其他類型,它可以沒有這些信息。我的問題是我不能爲字節數組實現operator[],因爲散列函數需要兩個參數。我想保持operator[]。有沒有什麼辦法解決這個問題(沒有專注於T*,並在該專業化中拋出編譯器錯誤operator[])?關於模板專業化

回答

1

我在這裏感到困惑,因爲我沒有得到散列表上的operator []與存儲在其中的數據類型的operator []衝突。

如果你的hash_table有operator [],它可能是你爲key []提供密鑰的hash_map,也可能是那個operator []返回一個單元格的內容。

通常,如果我確實實現了自己的散列表,我並不直接將數據存儲在條目中,而是將數據加上一些「元數據」,即與單元有關的信息。由於你的散列表支持刪除,所以你需要確保你仍然可以達到可能被移動到別處的任何衝突,無論你現在的策略是尋找這樣一個單元。因此,刪除的單元格可用,但與從未佔用過的單元格有不同的含義,因爲它可能是碰撞過程中路徑的一部分。如你所說,散列函數是獨立的。它獨立於存儲機制,並且根本不調用哈希表的operator []。

散列表僅使用散列函數和比較函數,否則使用其自己的存儲策略和衝突處理策略。

+0

+1。我猜哈希表不應該知道密鑰的字節佈局。我將爲字節數組鍵實現一個包裝類。 – nakiya 2011-01-19 09:56:03

0

可以處理字節數組以及固定長度的數據類型

所以,你的字節數組的大小而變化。你需要記錄每個地方的長度。如果你想通過值將它們存儲在哈希表中,那麼你可以將數據和長度值打包在一個對象中:STL已經提供了一些類適用於這個類,包括std :: vector和std :: string < >。或者,如果您只希望哈希表存儲指向您的字節數組的指針/引用,則可以創建一個普通的「句柄」類,它可以存儲或知道在哪裏查找長度,並且具有指向/指向數據的指針/引用。

正如「CashCow」指出的,字節數組上的operator[]與散列表上的operator[]之間沒有固有衝突......如果需要,它們甚至可以鏈接在一起。