3

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

4

1 回答 1

1

假设hash这里是std::hash,除了任何指针类型的泛型特化之外,没有特化std::hashforchar*wchar*其他特化,它基于指针值进行散列。

因此,如果您想TCHAR*用作散列键,并且散列基于字符串内容而不是指针值,则需要提供不同的散列函子类。

有一些特殊的std::hashforstringwstring,我认为如果你根据 选择正确的,你可以使用它们_UNICODE。我说“我认为”是因为 TCHAR* 应该只转换为stringor wstring,但如果我遗漏了什么,那么您可以编写一个简单的包装器。

但是,如果您要执行其中任何一个,那么您也可以使用stringwstring作为哈希键,因为无论如何都需要转换所有内容以进行哈希处理。这也将允许您将字符串添加到您的 unordered_set 中,而不必让它们一直闲逛直到它们被删除。使用上面的代码,我想将字符串文字以外的任何内容添加到集合中会很麻烦。

如果您担心速度,而不担心管理字符串,那么选择您最喜欢的字符串散列算法并将其应用于字符串数据。

于 2010-11-25T14:32:22.323 回答