Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.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++ 散列<;标准::字符串>;vs hash<;标准::字符串视图>;_C++_C++17_String View - Fatal编程技术网

C++ 散列<;标准::字符串>;vs hash<;标准::字符串视图>;

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

介绍了C++17。在编写自己的自定义哈希时,我希望重用字符串哈希的STL实现

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())
,更复杂,也可能更慢。@Valentin
std::hash
在散列文本时速度较慢,因为必须创建字符串的副本。对
std::string
@Valentin进行散列时,它不会变慢:一般来说,您通常不会直接要求散列。您通常使用一个容器,如
无序的\u映射
,它本身要求散列。如果您需要一个
无序映射
,因为它需要拥有密钥的存储,那么它将使用
散列
,而不是
字符串视图
。出于好奇,从理论上讲,编译器在传递字符串文字时是否允许在这里的
std::string
场景中应用堆省略?为什么我不在第二种情况下使用
std::hash()(myStr.c_str())
,而且可能会更慢。@Valentin
std::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