C++ 使用std::hash<;uint64_t>;对于自定义类
以下两个return语句是否返回相同的内容C++ 使用std::hash<;uint64_t>;对于自定义类,c++,stdhash,C++,Stdhash,以下两个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 nam
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_;
}
类非平凡类
{
公众:
大小\u t哈希()常量
{
//变体1
返回std::hash::_Do_hash(my_val);
//变体2希望避免创建命名对象
散列哈希器;
返回哈希器(my_val);
}
私人:
//用于散列的相关信息存储在此处
uint64\u t我的价值;
}
我直觉上想写一些像这样的东西
return std::hash<uint_64>(my_val_);
返回std::hash(my_val_);
它没有编译(因为我没有初始化结构的实例?!)。有没有别的方法让我错过了?是否担心创建命名哈希结构是不必要的?一种更简单的编写方法是使用临时对象:
return std::hash<uint64_t>{}(my_val_);
返回std::hash{}(my_val);
它的作用与第二种方法相同
我不能确定\u Do\u hash
做了什么,但无论如何它都是非标准的,不应该使用,以避免可移植性问题
由于谷歌搜索没有显示任何函数文档,我假设它是您正在使用的标准库实现的一个实现细节,用户代码并不打算使用它。因此,即使您不关心可移植性,也不应该使用它
还请注意,无论您是使用带命名变量的方法,还是使用临时变量的方法,都与性能无关。编译器几乎肯定会从中生成相同的代码。您使用的是纯粹的代码风格问题。
返回std::hash{}(my_val)代码>是我将要做的,我敦促您也这样做。:)<代码>\u Do\u hash
不是标准的,可能只在MSVC中有效<代码>std::hash很可能是一个空结构,创建它的对象一点也不麻烦。谢谢,就这样:)