我知道hashmap在Java中是如何工作的。但我无法完全理解C ++。
我找到了一些简单的教程,但没有哈希函数等。
字符串是否需要哈希函数?
hash_map<string, string> hm;
hm.insert(make_pair("one", "two"));
hm.insert(make_pair("three", "four"));
如果没有字符串的哈希函数,它将如何工作? 如何添加哈希函数?
有没有关于hash_map的好教程?
谢谢!
答案 0 :(得分:10)
对于初学者来说,hash_map
不是标准的C ++库;它是Visual Studio和g ++附带的编译器扩展。如果要在C ++中使用更标准化的哈希表,请查看Boost.Unordered库,TR1哈希容器,或者,如果您有更现代的编译器,请查看新的C ++ 0x标准哈希容器类型。这些容器名为unordered_map
和unordered_set
,而不是更具暗示性的hash_map
或hash_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
而不是默认的哈希函数。
希望这有帮助!
答案 1 :(得分:1)
您使用的是哪个hashmap实现?在C ++ 0x中添加的一个,std :: unordered_map,已经为某些类型(包括字符串)定义了散列函数。如果您尝试使用没有散列函数的散列映射,则无法编译(当您尝试插入某些内容时会发生错误。)