C++ 散列<;标准::字符串>;vs hash<;标准::字符串视图>;
介绍了C++17。在编写自己的自定义哈希时,我希望重用字符串哈希的STL实现C++ 散列<;标准::字符串>;vs hash<;标准::字符串视图>;,c++,c++17,string-view,C++,C++17,String View,介绍了C++17。在编写自己的自定义哈希时,我希望重用字符串哈希的STL实现 std::hash()(“你好,世界”)比std::hash()(“你好,世界”)慢吗?是一样的吗 我什么时候想使用std::hash() std::hash()(“你好,世界”)比std::hash()(“你好,世界”)慢吗 对 前者比较慢,因为创建std::string比创建std::string\u视图要慢 我什么时候想使用std::hash() 当您有一个std::string对象并希望从中计算哈希值时 std
std::hash()(“你好,世界”)
比std::hash()(“你好,世界”)
慢吗?是一样的吗
我什么时候想使用std::hash()
std::hash()(“你好,世界”)
比std::hash()(“你好,世界”)
慢吗
对
前者比较慢,因为创建std::string
比创建std::string\u视图要慢
我什么时候想使用std::hash()
当您有一个std::string
对象并希望从中计算哈希值时
std::hash()(“你好,世界”)
比std::hash()(“你好,世界”)
慢吗
对
前者比较慢,因为创建std::string
比创建std::string\u视图要慢
我什么时候想使用std::hash()
当您有一个std::string
对象并希望从中计算哈希值时。std::hash
将std::string常量&
作为其运算符()的参数。
。如果您有std::string
,并且正在散列它们,那么这就是您想要的。如果使用散列
,则必须将std::string
转换为std::string\u视图
,这会给它带来一些成本(不多,但它确实存在)
如果您的数据集不仅包含std::string
s,还包含c字符串,那么hash
可能会更好。将c字符串转换为std::string可能需要动态内存分配,因此如果可以避免这种情况,通常您会在性能领域获胜。但这需要分析,因为s和c字符串的混合以及c字符串的大小都很重要,因为SSO(短字符串优化)可能使std::hash
成为更好的选择。std::hash
将std::string const&
作为其运算符()的参数。如果您有std::string
,并且正在散列它们,那么这就是您想要的。如果使用散列
,则必须将std::string
转换为std::string\u视图
,这会给它带来一些成本(不多,但它确实存在)
如果您的数据集不仅包含std::string
s,还包含c字符串,那么hash
可能会更好。将c字符串转换为std::string可能需要动态内存分配,因此如果可以避免这种情况,通常您会在性能领域获胜。但这需要分析,因为s和c字符串的混合以及c字符串的大小都很重要,因为SSO(短字符串优化)可能会使std::hash
成为更好的选择。为什么我不在第二种情况下使用std::hash()(myStr.c_str())
,更复杂,也可能更慢。@Valentinstd::hash
在散列文本时速度较慢,因为必须创建字符串的副本。对std::string
@Valentin进行散列时,它不会变慢:一般来说,您通常不会直接要求散列。您通常使用一个容器,如无序的\u映射
,它本身要求散列。如果您需要一个无序映射
,因为它需要拥有密钥的存储,那么它将使用散列
,而不是字符串视图
。出于好奇,从理论上讲,编译器在传递字符串文字时是否允许在这里的std::string
场景中应用堆省略?为什么我不在第二种情况下使用std::hash()(myStr.c_str())
,而且可能会更慢。@Valentinstd::hash
在散列文本时会更慢,因为必须创建字符串的副本。对std::string
@Valentin进行散列时,它不会变慢:一般来说,您通常不会直接要求散列。您通常使用一个容器,如无序的\u映射
,它本身要求散列。如果您需要一个无序映射
,因为它需要拥有密钥的存储,那么它将使用散列
,而不是字符串视图
。出于好奇,理论上,当传递字符串文本时,编译器是否可以在std::string
场景中应用堆省略?我更喜欢这个答案@eerorika说“前者比较慢,因为创建std::string比创建std::string_视图要慢”,我不明白为什么计算std::string的散列意味着复制它-它只是通过引用获取它并对其进行操作,正如您所说的那样。@Valentin请注意,eerorika的std::hash()(“你好,世界”)是正确的
比std::hash()(“你好,世界”)
慢,因为它必须先创建std::string
。我更喜欢这个答案@eerorika说“前者比较慢,因为创建std::string比创建std::string_视图要慢”,我不明白为什么计算std::string的散列意味着复制它-它只是通过引用获取它并对其进行操作,正如您所说的那样。@Valentin请注意,eerorika的std::hash()(“你好,世界”)是正确的
比std::hash()(“你好,世界”)
慢,因为它必须先创建std::string
。