题
我想使用具有.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;
问题是当我尝试使用ashtset查找特定键时(使用 find
方法)我刚刚添加了 insert
它返回 HashSet::end()
!!
您能解释一下问题所在吗?我在VS2010下使用VC ++
解决方案
假如说 hash
这是 std::hash
, ,没有专业 std::hash
为了 char*
或者 wchar*
除了对任何指针类型的通用专业化(基于指针值)的通用专业化。
所以,如果您想使用 TCHAR*
作为哈希键,使用基于字符串内容而不是指针值的哈希键,您需要提供不同的哈希函数类。
有专业 std::hash
为了 string
和 wstring
, ,我认为如果您根据正确的选择,您可以使用 _UNICODE
. 。我说“我想”,因为tchar*应该转换为 string
或者 wstring
, ,但是如果我错过了一些东西,那么您可以写一个简单的包装纸。
但是,如果您打算这样做,那么您也可以使用 string
或者 wstring
作为哈希键,因为无论如何都需要转换一切。这还可以使您可以在Unordered_set中添加字符串,而无需将它们悬挂在删除之前。在上面的代码中,我想这是一个令人讨厌的烦恼,除了字符串文字外,其他任何内容。
如果您担心速度,并且不必担心管理字符串,请选择您喜欢的字符串散列算法并将其应用于字符串数据。
不隶属于 StackOverflow