【问题标题】:Using boost_unordered_hash_map with char* key使用带有 char* 键的 boost_unordered_hash_map
【发布时间】:2014-05-03 11:35:52
【问题描述】:

我混合了 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 对我来说是不方便的。有没有办法使第一个定义起作用?

【问题讨论】:

  • 你有一个最小的例子吗?
  • 默认比较器可能是==。不适用于char*,如果您想比较字符串值,您将改为比较指针。 (也就是说,我还没有检查文档。)
  • 它不起作用的原因是因为查找的键是指针,而不是指向的字符串。使用 std::string 可以让相等运算符 (==) 处理字符串内容
  • 如何更改默认比较运算符?

标签: c++ boost hashmap


【解决方案1】:

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

【讨论】:

  • 糟糕。我错过了您问题中的unordered_。现已添加。
  • 感谢您的解决方案和更正!但是,当我对“std::map”使用上述任何解决方案时,我收到一个错误,指出模板参数的数量错误。模板是。我猜你错过了上面的分配器类。
  • @NewToAndroid 我没有遗漏任何东西 :) 我什至还现场编译了示例,所以你可以看到情况就是这样。显然你的编译器平台有点挑战,是的,你可能不得不解决这个问题。虽然我知道当前没有编译器会对这个特定代码有问题。
  • 你什么都没有错过,我是缺少包含标题的人 :) 感谢您提供的答案就像魔术一样!
猜你喜欢
  • 2013-12-10
  • 1970-01-01
  • 2013-01-19
  • 1970-01-01
  • 2017-12-03
  • 2014-05-19
  • 1970-01-01
  • 1970-01-01
  • 2012-06-25
相关资源
最近更新 更多