自 std::pair<std::string, unsigned int>
没有为 __gnu_cxx HashMap 定义,如何使用 std::pair<std::string, unsigned int>
类型的键创建 __gnu_cxx HashMap 和类型 std::pair<int, CBTNODE>
的值? ( CBTNODE
是 typedef
为 typedef 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/