无序的TCHAR *要求?

时间:2010-11-25 13:32:23

标签: c++ unordered-set

我想使用像.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 ++

1 个答案:

答案 0 :(得分:1)

假设此处hashstd::hash,除了std::hashchar*之外,对于任何指针类型的通用专门化都没有wchar*的特化,基于指针值的哈希值。

所以,如果你想使用TCHAR*作为哈希键,使用基于字符串内容而不是指针值的哈希,你需要提供一个不同的哈希算子类。

std::hashstringwstring的专精,如果您根据_UNICODE选择正确的string,我认为您可以使用。我说“我认为”因为TCHAR *应该转换为wstringstring,但如果我错过了某些内容,那么你可以编写一个简单的包装器。

但是,如果您打算执行其中任何一项,那么您也可以使用wstring或{{1}}作为哈希键,因为无论如何都需要转换所有内容进行哈希处理。这也可以让你在你的unordered_set中添加字符串,而不必让它们在被删除之前保持不变。使用上面的代码,我想这是一个令人讨厌的事情,除了字符串文字之外还添加了任何东西。

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