我想使用像.Net HashSet这样的数据结构,我尝试将unordered_set与默认的散列方法和自定义比较器一起使用,如下所示:
struct comparer
{
bool operator()( const TCHAR* first,const TCHAR* second) const
{
return _tcscmp((TCHAR*)first,(TCHAR*)second) == 0;
}
};
typedef unordered_set<const TCHAR*,hash<const TCHAR*>,comparer> HashSet;
问题是当我尝试使用HashtSet查找特定的密钥(使用find
方法)时,我刚刚使用insert
添加它,它返回HashSet::end()
!!
你能解释一下这是什么问题吗? 我在VS2010下使用VC ++
答案 0 :(得分:1)
假设此处hash
为std::hash
,除了std::hash
或char*
之外,对于任何指针类型的通用专门化都没有wchar*
的特化,基于指针值的哈希值。
所以,如果你想使用TCHAR*
作为哈希键,使用基于字符串内容而不是指针值的哈希,你需要提供一个不同的哈希算子类。
std::hash
和string
有wstring
的专精,如果您根据_UNICODE
选择正确的string
,我认为您可以使用。我说“我认为”因为TCHAR *应该转换为wstring
或string
,但如果我错过了某些内容,那么你可以编写一个简单的包装器。
但是,如果您打算执行其中任何一项,那么您也可以使用wstring
或{{1}}作为哈希键,因为无论如何都需要转换所有内容进行哈希处理。这也可以让你在你的unordered_set中添加字符串,而不必让它们在被删除之前保持不变。使用上面的代码,我想这是一个令人讨厌的事情,除了字符串文字之外还添加了任何东西。
如果您担心速度,而不担心管理字符串,请选择您喜欢的字符串哈希算法并将其应用于字符串数据。