您鏈接到的hash_map文件表明您可以提供你自己的特質類作爲第三個模板參數。這必須滿足與hash_compare相同的界面。
掃描的文檔,我認爲你必須做的這是什麼,這基本上取代你在你的字典有使用StringComparer.OrdinalIgnoreCase
:
struct my_hash_compare {
const size_t bucket_size = 4;
const size_t min_buckets = 8;
size_t operator()(const LPCWSTR &Key) const {
// implement a case-insensitive hash function here,
// or find something in the Windows libraries.
}
bool operator()(const LPCWSTR &Key1, const LPCWSTR &Key2) const {
// implement a case-insensitive comparison function here
return _wcsicmp(Key1, Key2) < 0;
// or something like that. There's warnings about
// locale plastered all over this function's docs.
}
};
我很擔心,但該文檔說,比較函數必須是一個總的順序,而不是像C++標準庫中的排序容器通常那樣嚴格的弱順序。如果MS確實意味着全部訂單,那麼hash_map可能依賴於它與operator==
一致。也就是說,他們可能會要求如果my_hash_compare()(a,b)
爲假,並且my_hash_compare()(b,a)
爲假,那麼a == b
。很明顯,這不符合我寫的內容,在這種情況下,你運氣不好。
作爲一種替代方案,在任何情況下可能效率更高,您可以在地圖中使用它們之前將所有按鍵都推送到常見情況。不區分大小寫的比較比常規字符串比較成本更高。儘管如此,還是有一些Unicode技術可以解決這個問題。也許你必須轉換 - >小寫 - >大寫,而不是隻是 - >大寫,或類似的東西,以避免在某些語言或標題字符的一些討厭的情況。任何人?
正如其他人所說,你可能不希望LPCWSTR作爲你的鑰匙。這將在地圖中存儲指針,這意味着插入字符串的任何人都必須確保指向的數據保持有效,只要它位於hash_map中即可。從長遠來看,hash_map通常會將密鑰字符串的副本傳遞給insert
,在這種情況下,您應該使用wstring
作爲關鍵。
'hash_map'不是STL或任何當前或計劃的C++標準庫的一部分。也許你在談論'TR1 :: unordered_map'? – 2009-12-23 00:09:10
我指的是Visual C++中包含的一個,如此處所述:http://msdn.microsoft.com/en-us/library/0d462wfh(VS.100).aspx – 2009-12-23 00:15:24
STL是否有內置的解決方案這個問題? – 2009-12-23 00:15:57