我來自Java,我對C++和C有一些瞭解,但並不深入。我創建散列表類,它將封裝存儲值和密鑰。但問題是什麼是更好的方法來傳遞,例如,在構造函數自定義函數中,它將計算表中的散列鍵。在C++中使用函數作爲類成員
在java中,我會使用函數(接口)將其設置爲類成員。在C++中使用函數指針作爲成員的最佳做法是什麼?請建議如何執行此操作。
我來自Java,我對C++和C有一些瞭解,但並不深入。我創建散列表類,它將封裝存儲值和密鑰。但問題是什麼是更好的方法來傳遞,例如,在構造函數自定義函數中,它將計算表中的散列鍵。在C++中使用函數作爲類成員
在java中,我會使用函數(接口)將其設置爲類成員。在C++中使用函數指針作爲成員的最佳做法是什麼?請建議如何執行此操作。
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());
};
感謝您的回答。與Java相同。但是如果需要在運行時更改哈希函數呢? – brvtzhhu 2015-02-24 20:41:51
你可以有另一種方法 - 'rehash(Hash new_hash)'。如果您擔心這個新的散列函數必須與舊散列函數的類型相同,您可以在'std :: function'中隱藏具體類型。 – 2015-02-24 20:45:15
你爲什麼不使用'的std :: map'(或無序變體) ? – Mat 2015-02-24 18:35:03
@Mat我認爲這是一項家庭作業。對於OP來說,如果你嘲笑你期望的構造函數簽名和散列方法簽名會很有幫助,因爲這個問題有很多可能的解決方案。 – aruisdante 2015-02-24 18:36:56
你的類是模板還是固定的鍵和值類型? – leemes 2015-02-24 18:37:26