C ++:不区分大小写“Boost:unordered_map”不起作用?

时间:2012-01-18 17:42:56

标签: c++ boost case-insensitive unordered-map

我试图从std :: unordered_map(VS2010)切换到boost :: unordered_map(版本1.48),令人惊讶的是,一些重要的测试用例在我的项目中失败了。我找到了原因并得出结论,boost :: unordered_map不尊重我的不区分大小写的相等提供者:

struct StringEqualityCaseInsensitive : public std::equal_to<String>
{
    bool operator ()(const String& a, const String& b) const { return boost::iequals<String, String>(a, b); }
};

boost::unordered_map<string, int, boost::hash<string>, StringEqualityCaseInsensitive> map;

现在我只添加一些大写元素并搜索它们的小写对应物(使用find()成员方法)。如果我使用std :: unordered_map它可以正常工作并且使用boost它不会。残酷的是,如果我查找大写元素,则会调用相等比较器,当我查找小写时,它不会被调用...

任何人都有线索,这是为什么? (不确定这是否重要,但我使用的是启用了C ++ 0x支持的英特尔编译器12.1)

编辑:该死的,现在它已经恍然大悟了。也许我还需要调整哈希类以返回与低/大写无关的相同值。但他们有不同的行为仍然很奇怪?!

谢谢!

1 个答案:

答案 0 :(得分:8)

我怀疑它会在boost::unordered_mapstd::unordered_map中起作用,因为您的哈希函数定义错误。默认boost::hash<string> 不区分大小写,这意味着哈希表的基本假设之一

a == b   =>   hash(a) == hash(b)

被破坏(即HELLOhello可能会产生不同的哈希值)。这两个地图给出了不同的结果只是一个实现细节。