对纯整数数组使用 C++ std::hash 内置特化
Posted
技术标签:
【中文标题】对纯整数数组使用 C++ std::hash 内置特化【英文标题】:Use C++ std::hash built-in specialization for plain integer array 【发布时间】:2021-11-28 05:54:46 【问题描述】:我有 16 位整数数组形式的数据:
uint16_t a[n]
我需要一个散列函数来将这些数据存储到unordered_set
中。现在标准库为字符串提供了内置的特化(string
、u8string
、u16string
,...)。我正在做的是:
std::hash<std::u16string>(std::u16string((char16_t*)a, n))
有没有一种方法可以使用底层散列函数,而无需创建和销毁字符串对象的开销,也无需实现显式散列算法(可能比标准算法差)?
编辑:我正在考虑像通用哈希专业化这样的东西,需要几个迭代器,但它似乎不存在。
【问题讨论】:
【参考方案1】:这正是std::basic_string_view
的用途。正如人们所期望的那样,有一些特殊的类型,其中之一是std::u16string_view
。
向构造函数传递指针和长度。然后你可以散列生成的对象。
【讨论】:
不也是创建对象吗?我知道它是一个更简单的对象,但在我看来,与 STL 哲学不同,它缺少基于迭代器的基本形式。 因为不同的类型不需要以相同的方式散列。该标准不要求使用任何特定的算法,只是结果是稳定的。例如,与生成的哈希值的大小和符号匹配的数字类型是恒等运算。它在语义上创建了一个对象,但在优化之后,与字符串视图相关的大部分(如果不是全部)开销都被优化掉了,只剩下散列调度。 @m.alessandrini 构造一个std::string
是昂贵的,因为它执行new
、复制和delete
,而不是因为它是一个对象。 string_view
是指针和整数的轻量级包装器。启用编译器优化后,foo(std::string_view)
和 foo(const char*, size_t)
通常会编译为相同或几乎相同的机器代码。以上是关于对纯整数数组使用 C++ std::hash 内置特化的主要内容,如果未能解决你的问题,请参考以下文章