Using boost_unordered_hash_map with char* key

Using boost_unordered_hash_map with char* key

本文关键字:char with key hash boost unordered Using map      更新时间:2023-10-16

我有一个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。是否有一种方法可以使第一个定义有效?

std::unordered_map


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

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

与快速&脏散列实现,如:

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