使用 std::hash<uint64_t> 自定义 class
Using std::hash<uint64_t> for custom class
下面两个return语句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
的作用,但无论如何它都是非标准的,不应使用,以避免可移植性问题。
由于 google 搜索没有找到该函数的任何文档,我假设它是您正在使用的标准库实现的一个实现细节,这并不意味着由用户代码使用。因此,即使您不关心可移植性,也根本不应该使用它。
另请注意,无论您使用命名变量的方法还是使用临时变量的方法,性能都无关紧要。编译器几乎肯定会从中生成相同的代码。您使用哪种纯粹是代码风格的问题。
下面两个return语句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
的作用,但无论如何它都是非标准的,不应使用,以避免可移植性问题。
由于 google 搜索没有找到该函数的任何文档,我假设它是您正在使用的标准库实现的一个实现细节,这并不意味着由用户代码使用。因此,即使您不关心可移植性,也根本不应该使用它。
另请注意,无论您使用命名变量的方法还是使用临时变量的方法,性能都无关紧要。编译器几乎肯定会从中生成相同的代码。您使用哪种纯粹是代码风格的问题。