我试图从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)
编辑:该死的,现在它已经恍然大悟了。也许我还需要调整哈希类以返回与低/大写无关的相同值。但他们有不同的行为仍然很奇怪?!谢谢!
答案 0 :(得分:8)
我怀疑它会在boost::unordered_map
或std::unordered_map
中起作用,因为您的哈希函数定义错误。默认boost::hash<string>
不不区分大小写,这意味着哈希表的基本假设之一
a == b => hash(a) == hash(b)
被破坏(即HELLO
和hello
可能会产生不同的哈希值)。这两个地图给出了不同的结果只是一个实现细节。