由于没有为__gnu_cxx哈希映射定义std::pair<std::string, unsigned int>
,如何使用类型为std::pair<std::string, unsigned int>
的键和类型为std::pair<int, CBTNODE>
的值创建__gnu_cxx哈希映射? (CBTNODE
typedef
为typedef int CBTNODE
)
如果有可能,我真的想用std::pair<std::string, unsigned int>
INDEX
typedef std::pair<std::string, unsigned int> INDEX
非常感谢任何帮助!
Z.Zen
答案 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等等。