hash_map问题/教程

时间:2011-03-14 19:08:25

标签: c++ hashmap

我知道hashmap在Java中是如何工作的。但我无法完全理解C ++。

我找到了一些简单的教程,但没有哈希函数等。

字符串是否需要哈希函数?

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

如果没有字符串的哈希函数,它将如何工作? 如何添加哈希函数?

有没有关于hash_map的好教程?

谢谢!

2 个答案:

答案 0 :(得分: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而不是默认的哈希函数。

希望这有帮助!

答案 1 :(得分:1)

您使用的是哪个hashmap实现?在C ++ 0x中添加的一个,std :: unordered_map,已经为某些类型(包括字符串)定义了散列函数。如果您尝试使用没有散列函数的散列映射,则无法编译(当您尝试插入某些内容时会发生错误。)