2015-02-24 47 views
0

我來自Java,我對C++和C有一些瞭解,但並不深入。我創建散列表類,它將封裝存儲值和密鑰。但問題是什麼是更好的方法來傳遞,例如,在構造函數自定義函數中,它將計算表中的散列鍵。在C++中使用函數作爲類成員

在java中,我會使用函數(接口)將其設置爲類成員。在C++中使用函數指針作爲成員的最佳做法是什麼?請建議如何執行此操作。

+6

你爲什麼不使用'的std :: map'(或無序變體) ? – Mat 2015-02-24 18:35:03

+0

@Mat我認爲這是一項家庭作業。對於OP來說,如果你嘲笑你期望的構造函數簽名和散列方法簽名會很有幫助,因爲這個問題有很多可能的解決方案。 – aruisdante 2015-02-24 18:36:56

+0

你的類是模板還是固定的鍵和值類型? – leemes 2015-02-24 18:37:26

回答

1

C++的做法是將參數化與可調用類型的類,將計算散列:

template<class Key, class Value, class Hash> class hashtable; 

這允許具有任何可調用對象作爲哈希函數,無論是純功能或仿函數對象。

然後通過在構造函數中調用對象:

template<class Key, class Value, class Hash> 
class hashtable 
{ 
    hashtable(Hash h); 
}; 

這可以讓你無需創建新類指定不同的散列函數。

最後,爲了使申報和hashtable的建設更方便,我們指定的默認模板參數和構造函數參數:

template<class Key, class Value, class Hash = std::hash<Key> > 
class hashtable 
{ 
    hashtable(Hash h = Hash()); 
}; 
+0

感謝您的回答。與Java相同。但是如果需要在運行時更改哈希函數呢? – brvtzhhu 2015-02-24 20:41:51

+0

你可以有另一種方法 - 'rehash(Hash new_hash)'。如果您擔心這個新的散列函數必須與舊散列函數的類型相同,您可以在'std :: function'中隱藏具體類型。 – 2015-02-24 20:45:15