【问题标题】:__gnu_cxx hash map with keys of type std::pair<std::string, unsigned int>?__gnu_cxx 带有 std::pair<std::string, unsigned int> 类型键的哈希映射?
【发布时间】:2010-10-25 17:43:45
【问题描述】:

由于没有为 __gnu_cxx 哈希映射定义 std::pair&lt;std::string, unsigned int&gt;,如何使用 std::pair&lt;std::string, unsigned int&gt; 类型的键和 std::pair&lt;int, CBTNODE&gt; 类型的值创建 __gnu_cxx 哈希映射? (CBTNODEtypedef 作为 typedef int CBTNODE

如果可能的话,我真的很想用 typedef-ed INDEX (typedef std::pair&lt;std::string, unsigned int&gt; INDEX) 替换 std::pair&lt;std::string, unsigned int&gt;

任何帮助将不胜感激!

禅宗

【问题讨论】:

    标签: c++ hashtable hashmap


    【解决方案1】:

    这似乎编译并打印了正确答案(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 等中被替换,等等。

    【讨论】:

      猜你喜欢
      • 2011-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 2011-02-18
      相关资源
      最近更新 更多