c++ - 使用 std::hash对于自定义类
问题描述
以下两个 return 语句返回相同的东西吗?
class NonTrivialClass
{
public:
size_t hash() const
{
// variation 1
return std::hash<uint64_t>::_Do_hash(my_val_);
// variation 2, wanted to avoid creating the named object
std::hash<uint64_t> hasher;
return hasher(my_val_);
}
private:
// relevant info for hashing purposes is stored here
uint64_t my_val_;
}
我凭直觉想写类似的东西
return std::hash<uint_64>(my_val_);
哪个没有编译(因为我没有初始化结构的实例?!)。还有另一种我想念的方式吗?是否担心不必要地创建命名的哈希结构?
解决方案
一种更简单的编写方法是使用临时对象:
return std::hash<uint64_t>{}(my_val_);
它与您的第二种方法做同样的事情。
我不能确定是什么_Do_hash
,但无论如何它是非标准的,不应该使用,以避免可移植性问题。
由于谷歌搜索没有找到该函数的任何文档,我认为它是您正在使用的标准库实现的实现细节,并且不打算由用户代码使用。因此,即使您不关心可移植性,也不应该使用它。
另请注意,无论您是使用命名变量的方法还是使用临时变量的方法,性能都无关紧要。编译器几乎肯定会从中生成相同的代码。您使用的纯粹是代码风格的问题。
推荐阅读
- android - 在 Android Studio 中更改多个(非常)相似的文件
- c - 如何避免 MSVC 警告 C4701:可能未初始化的局部变量
- javascript - PHP更改时区
- c# - 使用 LibGit2Sharp 计算文件在本地存储库中更改的次数
- ruby - 如何让一个字段更新/更改另一个字段?
- reactjs - 在 React Router 中创建可共享的链接
- r - 使用库 rtf 将 R 表达式插入单词
- r - 如何提取前 n 行并使用该子集计算每个组的函数,然后计算不同组的平均值?
- javascript - Three.js 定期将地球旋转到特定位置
- javascript - TypeError:无法读取未定义的属性“insertData”