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

C++: Case insensitive "Boost:unordered_map" does not work?

本文关键字:map 不起作用 unordered Boost 大小写 C++ 不区      更新时间:2023-10-16

我试图从std::unordereded_map(VS2010)切换到boost::unrdered_map(1.48版),令人惊讶的是,我的项目中一些重要的测试用例失败了。我找到了原因,得出的结论是boost::unordereded_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::unordereded_map,它工作得很好,而使用boost则不然。残酷的是,如果我寻找大写元素,相等比较器会被调用,而当我寻找小写元素时,它不会被调用。。。

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

编辑:该死,现在我明白了。也许我还需要调整哈希类,使其独立于大小写返回相同的值。但奇怪的是,他们有不同的行为?!

谢谢!

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

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

被破坏(即HELLOhello可以生成不同的散列)。两个映射给出不同的结果只是一个实现细节。