Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 当与无序的集合一起使用时,std::string是否需要哈希函数?_C++_Visual C++ - Fatal编程技术网

C++ 当与无序的集合一起使用时,std::string是否需要哈希函数?

C++ 当与无序的集合一起使用时,std::string是否需要哈希函数?,c++,visual-c++,C++,Visual C++,我使用的是一组无序的std::字符串。为其指定哈希函数的推荐方法是什么?目前它正在使用默认值。是否需要明确指定一个性能更好的选项?无需提供您自己的选项。如果您正在使用VS 2010,std::string的哈希函数位于xfunctional头文件中,该头文件由包含,如果您想亲自查看它是否满足您的需要: template<> class hash<_STD string> // ... 模板 类散列 // ... 对于一般的字符串来说,std::string的标准

我使用的是一组无序的std::字符串。为其指定哈希函数的推荐方法是什么?目前它正在使用默认值。是否需要明确指定一个性能更好的选项?

无需提供您自己的选项。如果您正在使用VS 2010,
std::string
的哈希函数位于
xfunctional
头文件中,该头文件由
包含,如果您想亲自查看它是否满足您的需要:

template<>
    class hash<_STD string>
// ...
模板
类散列
// ...

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

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

 std::unordered_map<X,int,hash_X> my_map;
std::无序映射我的映射;
其中,hash_X是哈希函数的定义

为完整起见,我将在

结构X{int i,j,k;}; 结构散列X{ 大小\u t运算符()(常数X和X){ 返回hash()(x.i)^hash()(x.j)^hash()(x.k); } };
我还没有弄清楚如何在答案下添加这条小评论……我更愿意在Michael Burr的答案下发布这条评论。无论如何,c++11将std::hash作为库的一部分。您可以查看所有受支持的哈希函数。

您可以显式指定另一个哈希函数,它的性能可能会更好,也可能不会更好,但您当然不需要这样做。您真正的问题是什么?问题是-默认值是否适用于std::stringOne当然希望如此!否则,编译器供应商为什么要将其与标准库一起提供?
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);
  }
};