对纯整数数组使用 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 中。现在标准库为字符串提供了内置的特化(stringu8stringu16string,...)。我正在做的是:

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 内置特化的主要内容,如果未能解决你的问题,请参考以下文章

获取尾随 1 位的数量

C++内置数据类型和变量

std::hash 特化仍未被 std::unordered_map 使用

js中Array.sort()对纯数字排序错误

无法对指向成员的指针使用 std::hash 的特化?

在 C++ 中同时使用 cin 将整数添加到数组 [关闭]