unordered_set 类型哈希,其比较使用部分类型数据
unordered_set hash for type, whose comparison uses part of the type data
我需要 std::unordered_set
对,其第一个元素应该不同。
仅散列对的第一个元素是否正确,如下所示?
using Pair = std::pair<int, int>;
struct Eq
{
bool operator() ( Pair const& lhs,
Pair const& rhs ) const
{
return (lhs.first == rhs.first);
}
};
struct Hash
{
std::size_t operator() ( Pair const &p ) const
{
return std::hash<int>()( p.first );
}
};
// No two pairs with same '.first'.
std::unordered_set<Pair, Hash, Eq> pairs;
for ( Pair const& p : ... )
{
pairs.insert(p);
}
一般来说,对于unordered_set<T>
:
如果类型 T
的等式函子不使用 T
的部分(某些数据成员),那么在 hash<T>
中也不使用该部分也是有意义的。
这样对吗?
是的,应该可以正常工作。从文档到 std::unordered_set::insert()(强调我的):
Inserts element(s) into the container, if the container doesn't already contain an element with an equivalent key.
您清楚地提供了一个谓词,表示当元素的 first
字段匹配时,元素应该被视为等同的。并且您指定了一个哈希值,以确保等效元素最终出现在同一个桶中。所以这对我来说很好。
我需要 std::unordered_set
对,其第一个元素应该不同。
仅散列对的第一个元素是否正确,如下所示?
using Pair = std::pair<int, int>;
struct Eq
{
bool operator() ( Pair const& lhs,
Pair const& rhs ) const
{
return (lhs.first == rhs.first);
}
};
struct Hash
{
std::size_t operator() ( Pair const &p ) const
{
return std::hash<int>()( p.first );
}
};
// No two pairs with same '.first'.
std::unordered_set<Pair, Hash, Eq> pairs;
for ( Pair const& p : ... )
{
pairs.insert(p);
}
一般来说,对于unordered_set<T>
:
如果类型 T
的等式函子不使用 T
的部分(某些数据成员),那么在 hash<T>
中也不使用该部分也是有意义的。
这样对吗?
是的,应该可以正常工作。从文档到 std::unordered_set::insert()(强调我的):
Inserts element(s) into the container, if the container doesn't already contain an element with an equivalent key.
您清楚地提供了一个谓词,表示当元素的 first
字段匹配时,元素应该被视为等同的。并且您指定了一个哈希值,以确保等效元素最终出现在同一个桶中。所以这对我来说很好。