2011-03-14 64 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已经为某些类型(包括字符串)定义了散列函数。如果您尝试使用没有散列函数的散列映射,它将不会编译(当您尝试插入某些内容时将发生该错误)。

相关问题