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 字段匹配时,元素应该被视为等同的。并且您指定了一个哈希值,以确保等效元素最终出现在同一个桶中。所以这对我来说很好。