2010-11-25 64 views
3

我想使用类似服务净HashSet的数据结构,我试图用默认的散列法和自定义比较使用unordered_set如下:TCHAR *要求的无序集?

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()

你能解释一下是什么问题? 我使用VC++ VS2010

+0

为什么你需要抛弃`_tcscmp()`的常量?这不应该是必要的。 – Rup 2010-11-25 13:38:34

+1

不知情的猜测:`hash <>`是散列指针值而不是字符串。但我不知道TR1班。 – Rup 2010-11-25 13:39:29

回答

1

假设hash这里是std::hash,存在一种用于char*wchar*比任何指针类型,即散列基于所述指针值的一般专业化之外,没有其他的std::hash专业化。

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

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

如果你打算去做那些,那么你可以使用stringwstring作为散列键,因为无论如何都需要转换所有东西。这也可以让你将字符串添加到你的unordered_set中,而不必让它们在被移除之前四处闲逛。上面的代码,我想这是一个滋扰,除了字符串文字以外的任何其他添加。

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