当与unordered_sets一起使用时,std :: string是否需要哈希函数?

时间:2012-03-15 22:55:02

标签: c++ visual-c++

我正在使用一组无序的std :: strings。为它指定哈希函数的推荐方法是什么?目前它正在使用默认值。我是否需要明确指定一个可以表现更好的?

4 个答案:

答案 0 :(得分:1)

std::string的标准专业化对于字符串来说可能已经足够好(甚至可能非常好)。但是如果您使用非常特定格式的字符串,您可能会为您的特定情况找到或设计更好的算法。

答案 1 :(得分:0)

没有必要提供自己的。如果您使用的是VS 2010,std::string的哈希函数位于xfunctional包含的<functional>头文件中,如果您想了解它是否符合您的需求:

template<>
    class hash<_STD string>
// ...

答案 2 :(得分:0)

您可以查看wiki,在那里您可以看到为了指定哈希函数,您应该编写如下内容:

 std::unordered_map<X,int,hash_X> my_map;

其中hash_X是散列函数的定义。

为了完整性,我包括了wiki

中定义的代码
struct X{int i,j,k;};

struct hash_X{
  size_t operator()(const X &x){
    return hash<int>()(x.i) ^ hash<int>()(x.j) ^ hash<int>()(x.k);
  }
};

答案 3 :(得分:0)

我仍然没有想出如何在答案中添加小评论...我更愿意在迈克尔伯尔的答案下发布这个。无论如何,c ++ 11有std::hash<string>作为库的一部分。 Here您可以查看所有支持的哈希函数。