c++ - __gnu_cxx HashMap ,其键类型为 std::pair<std::string, unsigned int>?

标签 c++ hashtable hashmap

std::pair<std::string, unsigned int>没有为 __gnu_cxx HashMap 定义,如何使用 std::pair<std::string, unsigned int> 类型的键创建 __gnu_cxx HashMap 和类型 std::pair<int, CBTNODE> 的值? ( CBTNODEtypedeftypedef int CBTNODE )

如果可以的话,我真的很想替换std::pair<std::string, unsigned int>带有 typedef-ed INDEX (typedef std::pair<std::string, unsigned int> INDEX)

任何帮助将不胜感激!

Z.Zen

最佳答案

这似乎编译并打印了正确的答案(1):

#include <hash_map>
#include <utility>
#include <string>
#include <iostream>

typedef int CBTNODE;
typedef std::pair<std::string, unsigned int> INDEX;
typedef std::pair<int, CBTNODE> Element;

struct pairhash{
    size_t operator()(const INDEX &p) const {
        return
          __gnu_cxx::hash<const char*>()(p.first.c_str()) ^
          __gnu_cxx::hash<unsigned int>()(p.second);
    }
};

int main() {
    __gnu_cxx::hash_map<INDEX, Element, pairhash> x;
    INDEX foo("hi", 0);
    Element bar(1, 2);
    x[foo] = bar;
    std::cout << x[foo].first << "\n";
}

这有点乏味。问题是 __gnu_cxx::hash 不提供对 pair 的专门化,也不提供 string 的专门化。我相信它遵循 SGI API:http://www.sgi.com/tech/stl/hash.html 。因此需要pairhash(或类似的东西)来提供缺少的哈希函数。

我不会责怪你没有发现这一点,因为这导致的编译器错误有点,嗯,不明显。而且很长。

如果可以的话,最好使用 boost::unordered_map。 SGI 的 hash_map 是一个旧的 API,从未被采用到标准中,由于在 C++0x 等中被替换,等等。

关于c++ - __gnu_cxx HashMap ,其键类型为 std::pair<std::string, unsigned int>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4017327/

相关文章:

java - 什么应该是哈希表中的关键的最佳实践

java - 字符串的通用哈希函数

java - 即使 hashCode/equals 被重写,HashMap 也返回 null

Java HashMap 迭代器

c++ - OpenGL 纹理映射不起作用

c++ - 如何使用概念来表达 "template T is a..."形式的条件?

c++ - 将 JSON 格式的属性树转换为点分隔字符串的 Boost 库函数?

size - 哈希表的最大大小应该是多少?

c++ - 将 unsigned int 的三元组映射到 double——这是最优化/最有效的方法吗?

java - 特殊的 HashMap 行为