我想使用类似于 .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 查找我刚刚使用 insert
添加的特定键(使用 find
方法)时,它返回 HashSet: :end()
!!
你能解释一下问题是什么吗? 我在 VS2010 下使用 VC++
最佳答案
假设这里的hash
是std::hash
,char*<没有
或 std::hash
的特化wchar*
而非任何指针类型的通用特化,它们基于指针值进行散列。
因此,如果您想使用 TCHAR*
作为散列键,散列基于字符串内容而不是指针值,则需要提供不同的散列仿函数类。
对于 string
和 wstring
有 std::hash
的特化,我认为如果你根据需要选择正确的,你可以使用到 _UNICODE
。我说“我认为”是因为 TCHAR* 应该只转换为 string
或 wstring
,但如果我遗漏了什么,那么您可以编写一个简单的包装器。
不过,如果您打算执行其中任何一项,那么您也可以使用 string
或 wstring
作为散列键,因为一切都需要无论如何转换为散列。这也将允许您将字符串添加到您的 unordered_set 中,而不必让它们一直存在直到它们被删除。使用上面的代码,我认为将字符串文字以外的任何内容添加到集合中是一件令人讨厌的事情。
如果您担心速度而不担心管理字符串,请选择您最喜欢的字符串哈希算法并将其应用于字符串数据。
关于c++ - unordered_set 的 TCHAR* 要求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4277597/