[英]C++: Case insensitive “Boost:unordered_map” does not work?
我試圖從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)
編輯:該死的,現在它突然降臨在我身上。 也許我還需要調整哈希類以獨立於小寫/大寫返回相同的值。 但是奇怪的是,他們有不同的行為?!
謝謝!
我懷疑它是否可以在boost::unordered_map
或std::unordered_map
,因為您的哈希函數定義錯誤。 默認的boost::hash<string>
不區分大小寫,這意味着哈希表的基本假設之一
a == b => hash(a) == hash(b)
已損壞(即HELLO
和hello
可能生成不同的哈希值)。 這兩個映射給出不同的結果只是實現細節。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.