c++ - hash_map 问题/教程

标签 c++ hashmap

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

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

字符串需要哈希函数吗?

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

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

hash_map有什么好的教程吗?

谢谢!

最佳答案

对于初学者来说,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 而不是默认的哈希函数。

希望这对您有所帮助!

关于c++ - hash_map 问题/教程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5303205/

相关文章:

c++ - 构造函数 move

c++ - 二进制读取器在读取确切字节数时不触发 eof 位

c++ - 为什么我的 rand() 产生负数?

java - 如果 HashMap 满了怎么办?

java - 如何打印数组中出现次数最多的 5 个数字?

java - 为什么声明相似的对象名和HashMap没有冲突?

c++ - 声明没有指针的默认参数循环引用?

c++ - 将 double 转换和格式化为 QString

Java,什么是持久化对象的直接、简单的方法?所有方法都需要序列化吗?

java - 向 HashMap 添加集合