2011-03-14 77 views
3

我知道哈希映射如何在Java中工作。但我無法完全理解C++。hash_map questions/tutorial

我發現了一些簡單的教程,但目前還沒有hashfunctions等。

是否字符串需要混雜功能?

hash_map<string, string> hm; 
hm.insert(make_pair("one", "two")); 
hm.insert(make_pair("three", "four")); 

它將如何工作,沒有散列函數的字符串? 如何添加哈希函數?

有什麼好的教程hash_map?

謝謝!

回答

10

對於初學者,hash_map不是標準的C++庫;它是Visual Studio和g ++附帶的編譯器擴展。如果您想在C++中使用更標準化的哈希表,請查看Boost.Unordered庫,TR1哈希容器,或者如果您有更現代的編譯器,請查看新的C++ 0x標準哈希容器類型。這些容器被命名爲unordered_mapunordered_set,而不是更具暗示性的hash_maphash_set,具有更標準化的支持,並且更便攜。

關於如何指定散列函數的問題,hash_map對大多數標準類型(包括std::string)都有內置的散列函數,因此您不需要指定一個。如果你想定義你自己的散列函數,你應該創建一個函數對象,它重載operator()以提供一個散列碼,然後在其他類型的基礎上通過該類型參數化hash_map。例如:

struct MyCustomHash { 
    size_t operator() (const string& str) const { 
     /* Terrible hash function... for instructional purposes only! */ 
     return str.empty()? 0 : str[0]; 
    } 
}; 

hash_map<string, int, MyCustomHash> myHashMap; 

現在myHashMap將使用MyCustomHash而不是默認的哈希函數。

希望這會有所幫助!

+2

在TR1中,哈希映射稱爲unordered_map。 – fbafelipe 2011-03-14 19:26:28

+0

這是一個很好的觀點 - 我會更新這個帖子來提一提。 – templatetypedef 2011-03-14 19:28:58

+0

謝謝!有沒有辦法直接調用字符串的散列函數?像s的東西; s.getHash(); – VextoR 2011-03-14 19:42:34

1

你正在使用哪個hashmap實現?在C++ 0x中添加的std :: unordered_map已經爲某些類型(包括字符串)定義了散列函數。如果您嘗試使用沒有散列函數的散列映射,它將不會編譯(當您嘗試插入某些內容時將發生該錯誤)。