C++17 引入hash<string_view>
。在编写我自己的自定义散列时,我想重用字符串散列的 STL 实现。
std::hash<std::string>()("Hello, world")
比 慢吗std::hash<std::string_view>()("Hello, world")
?是一样的吗?
我什么时候想使用std::hash<std::string>()
?
C++17 引入hash<string_view>
。在编写我自己的自定义散列时,我想重用字符串散列的 STL 实现。
std::hash<std::string>()("Hello, world")
比 慢吗std::hash<std::string_view>()("Hello, world")
?是一样的吗?
我什么时候想使用std::hash<std::string>()
?
std::hash<std::string>()("Hello, world")
比 慢吗std::hash<std::string_view>()("Hello, world")
?
是的。
前者较慢,因为创建 astd::string
比创建 a 慢std::string_view
。
我什么时候想使用
std::hash<std::string>()
?
当您有一个std::string
对象并且想要从中计算哈希值时。
std::hash<std::string>
将 astd::string const&
作为其 的参数operator()
。如果你有std::string
's,并且你正在对它们进行散列,那么这就是你想要的。如果您使用hash<string_view>
,则必须将其转换std::string
为 a std::string_view
,这需要花费一些成本(不多,但确实存在)。
如果您的数据集不仅包含std::string
s 还包含 c 字符串,那么hash<string_view>
可能会更好。将 c-string 转换为std::string
can 需要动态内存分配,因此如果您可以避免这种情况,通常您会在性能领域获胜。这需要分析,因为std::string
s 和 c 字符串的混合以及 c 字符串的大小作为 SSO(短字符串优化)可能std::hash<std::string>
是更好的选择。