【发布时间】:2012-01-18 17:42:56
【问题描述】:
我尝试从 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 支持的 Intel Compiler 12.1)
编辑:该死的,现在我明白了。也许我还需要调整哈希类以独立于小写/大写返回相同的值。但是他们有不同的行为仍然很奇怪?!
谢谢!
【问题讨论】:
-
可能是因为大小写不同会产生不同的哈希,这对于哈希映射来说比相等测试更重要。
-
那么直接的问题就是,如何让哈希函数不区分大小写^^?
标签: c++ boost case-insensitive unordered-map