【问题标题】:unordered_set of TCHAR* requirements?unordered_set 的 TCHAR* 要求?
【发布时间】:2010-11-25 13:32:23
【问题描述】:

我想使用类似 .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 来查找我刚刚使用 insert 添加的特定键(使用 find 方法)时,它返回 HashSet::end()!!

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

【问题讨论】:

  • 为什么你需要抛弃_tcscmp() 的常量?这不应该是必要的。
  • 不知情的猜测:hash&lt;&gt; 正在散列指针值而不是字符串。但我不知道 TR1 课程。
  • @Rup:我是这么想的,但我想确定一下!
  • @Rup:这是另一个代码的复制粘贴问题!对此感到抱歉

标签: c++ unordered-set


【解决方案1】:

假设这里的hash 是std::hash,除了任何指针类型的通用特化之外,没有针对char* 或wchar* 的特化std::hash,它基于指针值进行散列。

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

对于string 和wstring 有专门的std::hash,我认为如果您根据_UNICODE 选择正确的一个,您可以使用它们。我说“我认为”是因为 TCHAR* 应该只转换为 string 或 wstring,但如果我遗漏了什么,那么您可以编写一个简单的包装器。

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

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

【讨论】:

  • 将tstring 定义为std::basic_string&lt;TCHAR&gt; 是很常见的。这将等于std::string 或std::wstring,因此您可以免费获得相应的hash。
猜你喜欢
  • 2012-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-10
  • 2016-08-23
相关资源
最近更新 更多