C++:不区分大小写"Boost:unordered_map"不起作用?
C++: Case insensitive "Boost:unordered_map" does not work?
我试图从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_map
或std::unordered_map
中是否有效,因为您的哈希函数定义错误。默认的boost::hash<string>
不区分大小写,这意味着哈希表的基本假设之一
a == b => hash(a) == hash(b)
被破坏(即HELLO
和hello
可以生成不同的散列)。两个映射给出不同的结果只是一个实现细节。
相关文章:
- 我的神经网络不起作用 [XOR 问题]
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- C++为什么尽管我调用了void函数,它却不起作用
- 为什么在保护模式下继承升级不起作用
- 循环在计数器中不起作用
- 在其他文件中创建类时在 c++ 项目中不起作用
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- 为什么二进制搜索在我的测试中不起作用
- 我的代码中有错误吗?使用BGI图形的C++代码对我不起作用
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 带有指定长度字符* 参数的 std::regex_search 在 VS2017 中不起作用?
- Bjarne Stroustrup Book - std_lib_facilities.h - 不起作用(未知类型名称)
- 为什么简单的算术减法在"if"条件下不起作用?
- 为什么Stroustup书中的has_f不起作用
- 仅包含可移动 std::map 的类的移动构造函数不起作用
- c value_type对于std :: tr1不起作用:std :: map中的元组
- Map::insert不起作用
- sf::字符串放入 std::map 键不起作用 - vaule 没有保存到地图中
- 迭代C++ std::map 的正确方法不起作用