簡體   English   中英

C ++:不區分大小寫的“ Boost:unordered_map”不起作用嗎?

[英]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_mapstd::unordered_map ,因為您的哈希函數定義錯誤。 默認的boost::hash<string> 區分大小寫,這意味着哈希表的基本假設之一

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

已損壞(即HELLOhello可能生成不同的哈希值)。 這兩個映射給出不同的結果只是實現細節。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM