我想使用具有.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;

问题是当我尝试使用ashtset查找特定键时(使用 find 方法)我刚刚添加了 insert 它返回 HashSet::end()!!

您能解释一下问题所在吗?我在VS2010下使用VC ++

有帮助吗?

解决方案

假如说 hash 这是 std::hash, ,没有专业 std::hash 为了 char* 或者 wchar* 除了对任何指针类型的通用专业化(基于指针值)的通用专业化。

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

有专业 std::hash 为了 stringwstring, ,我认为如果您根据正确的选择,您可以使用 _UNICODE. 。我说“我想”,因为tchar*应该转换为 string 或者 wstring, ,但是如果我错过了一些东西,那么您可以写一个简单的包装纸。

但是,如果您打算这样做,那么您也可以使用 string 或者 wstring 作为哈希键,因为无论如何都需要转换一切。这还可以使您可以在Unordered_set中添加字符串,而无需将它们悬挂在删除之前。在上面的代码中,我想这是一个令人讨厌的烦恼,除了字符串文字外,其他任何内容。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top