最近在使用STL中unordered_map这种容器的时候发现无法将key设置为pair类型,编译报错信息为:

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

查了下资料才发现unordered_map中没有针对pair的hash函数,需要手动传入一个hash函数。hash函数的一种简单实现如下:

struct hash_pair { 
    template <class T1, class T2> 
    size_t operator()(const pair<T1, T2>& p) const
    { 
        auto hash1 = hash<T1>{}(p.first); 
        auto hash2 = hash<T2>{}(p.second); 
        return hash1 ^ hash2; 
    } 
}; 

接下来把这个hash函数传给unordered_map就OK了!

unordered_map<pair<int,int>, int, hash_pair> um;

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

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐