2012-10-23 59 views
0

我在unordered_map中使用一個對象作爲鍵,所以我需要定義一個哈希函數。我的問題是,其中應該實施散列函數。我應該把它放在類實現中,還是應該在需要的地方實現它?何處實現散列函數?

UPDATE: 如果它的確與衆不同,這一切是基於一個框架

+0

你能告訴我們你到目前爲止實施了什麼嗎? –

+0

爲什麼你需要知道我在問什麼? – NebulaFox

回答

3

如果你預計你需要重複使用它在許多unordered_map S,把它放在顯眼的地方,就像在課堂上。

如果你只是需要它一次性unordered_map,把它放在你使用它的地方。你甚至可以use a lambda

+0

這是一種情況,我會*不*使用'lambda'。你可以確定,如果有人正在修改相等的定義,他們就不會發現追蹤用於實例化'unordered_map'的lambdas。鑑於相等函數和散列函數之間的依賴關係,它們應該彼此靠近定義。 –

+0

@JamesKanze Err ...「接近」彼此的連續兩行代碼(如我的鏈接所示)? –

+0

如果您也使用特殊的相等函數,那是一個很好的解決方案。我想在很多情況下,相等函數將是對象類型的'oparator =='。 –

1

我把它與類的定義,至少如果您使用==作爲 unordered_map中的相等函數。 散列函數的實現取決於等同比較的實現, ,並且在保持這兩者合在一起時有一定的優勢,以便在某人不改變散列函數的情況下減少 改變==的可能性。

如果你也定義地圖特殊平等的功能,然後 兩個函數應該被定義在一起,大概接近的地方 它們將被用於實例化地圖。

0

在我看來,如果散列函數是基本的如下,它應該是類的方法,也應該內聯。

int hashFunction(long x){ 
    return (int) (x % N); 
} 

如果它是一個稍微複雜一些的散列函數應該是這樣class.Because您將需要一個「N」,這將是spesific到類的方法。

+0

根據標準,散列函數的返回類型應該是'size_t',而不是'int'。而且我不知道你通常需要一個取決於班級的「N」。 –