【问题标题】:C++: Case insensitive "Boost:unordered_map" does not work?C ++:不区分大小写的“Boost:unordered_map”不起作用?
【发布时间】: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


【解决方案1】:

我怀疑它是否适用于boost::unordered_mapstd::unordered_map,因为您的哈希函数定义错误。默认的boost::hash&lt;string&gt;不区分大小写的,这意味着哈希表的基本假设之一

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

已损坏(即HELLOhello 可能会生成不同的哈希值)。两张地图给出不同的结果只是一个实现细节。

【讨论】:

  • 我同意你的观点;)。令人惊讶的是,正如我所提到的,它仍然适用于 std。至少对于我的测试用例,但我没有验证容器,容器只是在测试用例中使用,所以这可能是巧合。现在当我考虑它时,如果没有适当的散列函数,这真的不可能;)。愚蠢!
  • @thesaint:你能给出一些测试用例吗?
  • 顺便说一句,难道没有类似“boost::test_container(my_map)”这样的模板实例可以根据规范进行验证吗?!
  • "你能提供一些测试用例吗?"好吧,这可能不值得,因为元素的数量太少而且在某种意义上也是有序的。这真的可能是巧合。
  • 好的,现在它似乎工作正常;)。仍然感谢,即使这很明显。我只是不太习惯 C++!
猜你喜欢
  • 2013-06-20
  • 1970-01-01
  • 2012-08-17
  • 2020-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-25
相关资源
最近更新 更多