使用带有char *键的boost_unordered_hash_map

时间:2014-05-03 11:35:53

标签: c++ boost hashmap

我有混合的C和C ++文件,这些文件共同组成了我的程序。我正在使用boost无序哈希映射,我最初定义为:

typedef boost::unordered_map<char *, int> my_map;

然而,地图表现得很奇怪; find(key)找不到哈希映射中实际存在的密钥。然后,我将定义更改为:

typedef boost::unordered_map<std::string, int> my_map;

现在哈希映射工作正常。然而,为了使用地图,我将char *转换为std :: string是不方便的。有没有办法让第一个定义有效?

1 个答案:

答案 0 :(得分:6)

std::unordered_map


哦,啊哈。注意到你想要unordered_map。我最喜欢的一个是使用boost::string_ref代表字符串而不复制,所以你可以做

std::unordered_map<boost::string_ref, int> map;

快速&amp;脏哈希实现如:

namespace std
{
    template<>
    struct hash<boost::string_ref> {
        size_t operator()(boost::string_ref const& sr) const {
            return boost::hash_range(sr.begin(), sr.end());
        }
    };
}

查看 Live On Coliru

std::map


您可以使用自定义比较器:

std::map<char const*, int, std::less<std::string> > map;

请注意,这是非常低效的,但它显示了方式。

更高效的是包装/使用strcmp

#include <cstring>

struct less_sz
{
    bool operator()(const char* a, const char* b) const
    {
        if (!(a && b))
            return a < b;
        else
            return strcmp(a, b) < 0;
    }
};

然后

std::map<char const*, int, less_sz> map;

查看 Live On Coliru