__gnu_cxx哈希映射,键类型为std :: pair <std :: string,unsigned =“”int =“”>?</std :: string,>

时间:2010-10-25 17:43:46

标签: c++ hashtable hashmap

由于没有为__gnu_cxx哈希映射定义std::pair<std::string, unsigned int>,如何使用类型为std::pair<std::string, unsigned int>的键和类型为std::pair<int, CBTNODE>的值创建__gnu_cxx哈希映射? (CBTNODE typedeftypedef int CBTNODE

如果有可能,我真的想用std::pair<std::string, unsigned int> INDEX typedef std::pair<std::string, unsigned int> INDEX

取代{{1}}

非常感谢任何帮助!

Z.Zen

1 个答案:

答案 0 :(得分:3)

这似乎是编译并打印正确答案(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等等。