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

the*_*int 1 c++ boost unordered-map case-insensitive

我试图从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;
Run Code Online (Sandbox Code Playgroud)

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

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

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

谢谢!

ken*_*ytm 8

我怀疑它会在任何工作boost::unordered_map或者std::unordered_map,因为你的哈希函数定义错误.默认boost::hash<string>区分大小写,这意味着哈希表的基本假设之一

a == b   =>   hash(a) == hash(b)
Run Code Online (Sandbox Code Playgroud)

坏了(即HELLOhello可能产生不同的散列).这两个地图给出的结果不同只是一个实现细节.