1

C++17 引入hash<string_view>。在编写我自己的自定义散列时,我想重用字符串散列的 STL 实现。

std::hash<std::string>()("Hello, world")比 慢吗std::hash<std::string_view>()("Hello, world")?是一样的吗?

我什么时候想使用std::hash<std::string>()

4

2 回答 2

3

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对象并且想要从中计算哈希值时。

于 2019-03-21T17:02:42.363 回答
2

std::hash<std::string>将 astd::string const&作为其 的参数operator()。如果你有std::string's,并且你正在对它们进行散列,那么这就是你想要的。如果您使用hash<string_view>,则必须将其转换std::string为 a std::string_view,这需要花费一些成本(不多,但确实存在)。

如果您的数据集不仅包含std::strings 还包含 c 字符串,那么hash<string_view>可能会更好。将 c-string 转换为std::stringcan 需要动态内存分配,因此如果您可以避免这种情况,通常您会在性能领域获胜。这需要分析,因为std::strings 和 c 字符串的混合以及 c 字符串的大小作为 SSO(短字符串优化)可能std::hash<std::string>是更好的选择。

于 2019-03-21T17:15:11.613 回答