我想使用类似于.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++
最佳答案
假设此处的hash
为std::hash
,则除了针对任何指针类型的通用规范化(基于指针值散列)以外,没有针对std::hash
或char*
的wchar*
专门化。
因此,如果要使用TCHAR*
作为哈希键,并且哈希基于字符串内容而不是指针值,则需要提供其他哈希函数类。std::hash
和string
有wstring
的专业知识,我认为如果您根据_UNICODE
选择正确的代码,就可以使用。我说“我认为”是因为TCHAR *应该只转换为string
或wstring
,但是如果我错过了什么,那么您可以编写一个简单的包装器。
但是,如果要执行上述任一操作,则可以将string
或wstring
用作哈希键,因为无论如何都需要转换所有内容以进行哈希处理。这也将允许您将字符串添加到您的unordered_set中,而不必在删除之前将其保持悬挂状态。在上面的代码中,我想将字符串文字以外的任何内容添加到集合中是很麻烦的。
如果您担心速度,而又不担心管理字符串,那么请选择自己喜欢的字符串哈希算法并将其应用于字符串数据。
关于c++ - 是否未满足TCHAR *要求?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4277597/