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