2010-10-25 77 views
2

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

如果有可能,我真的想替换std::pair<std::string, unsigned int>与一个typedef-ED INDEXtypedef std::pair<std::string, unsigned int> INDEX

任何帮助将非常感激!

Z.Zen

回答

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等替代等。

相关问题