我想使用类似于.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++

最佳答案

假设此处的hashstd::hash,则除了针对任何指针类型的通用规范化(基于指针值散列)以外,没有针对std::hashchar*wchar*专门化。

因此,如果要使用TCHAR*作为哈希键,并且哈希基于字符串内容而不是指针值,则需要提供其他哈希函数类。
std::hashstringwstring的专业知识,我认为如果您根据_UNICODE选择正确的代码,就可以使用。我说“我认为”是因为TCHAR *应该只转换为stringwstring,但是如果我错过了什么,那么您可以编写一个简单的包装器。

但是,如果要执行上述任一操作,则可以将stringwstring用作哈希键,因为无论如何都需要转换所有内容以进行哈希处理。这也将允许您将字符串添加到您的unordered_set中,而不必在删除之前将其保持悬挂状态。在上面的代码中,我想将字符串文字以外的任何内容添加到集合中是很麻烦的。

如果您担心速度,而又不担心管理字符串,那么请选择自己喜欢的字符串哈希算法并将其应用于字符串数据。

关于c++ - 是否未满足TCHAR *要求?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4277597/

10-14 07:55