我想使用像.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++
发布于 2010-11-25 22:32:22
假设这里的hash是std::hash,除了针对任何指针类型的通用专门化之外,没有针对char*或wchar*的std::hash专门化,即根据指针值进行散列。
因此,如果您希望使用TCHAR*作为散列键,并且散列基于字符串内容而不是指针值,则需要提供不同的散列函数器类。
有针对string和wstring的std::hash的专门化,我认为如果您根据_UNICODE选择正确的专门化,您可以使用这些专门化。我说“我认为”是因为TCHAR*应该转换成string或wstring,但是如果我遗漏了什么,你可以写一个简单的包装器。
但是,如果您要执行这两种操作之一,那么您可以使用string或wstring作为散列键,因为无论如何都需要将所有内容转换为散列键。这还允许您将字符串添加到unordered_set中,而不必将它们挂起,直到它们被删除。使用上面的代码,我认为向集合中添加除字符串文字以外的任何内容都是一件麻烦的事情。
如果你担心速度,并且不担心字符串的管理,那么选择你最喜欢的字符串散列算法,并将其应用于字符串数据。
https://stackoverflow.com/questions/4277597
复制相似问题