菜鸟笔记
提升您的技术认知

std::pair作为unordered_map的key

使用pair作为unordered_map的key时会提示这样的错误:

error: implicit instantiation of undefined template 'std::__1::hash<std::__1::pair<int, int> >

意思是C++标准中没有为pair提供hash函数,所以在使用的时候需要人为传入一个。

pair作为unordered_map的key需要为pair添加hash函数

struct pair_hash
{
    template<class T1, class T2>
    std::size_t operator() (const std::pair<T1, T2>& p) const
    {
        auto h1 = std::hash<T1>{}(p.first);
        auto h2 = std::hash<T2>{}(p.second);
        return h1 ^ h2;
    }
};

unordered_map<pair<int,int>, bool>, int> error_hash; //error
unordered_map<pair<int,int>, bool>, int, pair_hash> ok_hash; //ok

另外,map容器并不需要hash函数,所以将key设置为pair是不会报错的。在数据量不大的情况下,也可以考虑使用map替代unordered_map,性能并不会有太大差异。