我理解,当从密钥O(1)中检索值时,unordered_map<T, int>
会更有效,而map<T, int>
将是关于性能的O(lg n)。
但是,我发现unordered_map<T, int>
不支持与map<T, int>
一样多的类型。
例如,map<pair<int, int>, int>
可以,但unordered_map<pair<int, int>, int>
不是。
我想知道这有什么潜在的困难吗?如果考虑性能,我可以使用什么数据结构来获得具有O(1)性能的密钥类型对的哈希表。
答案 0 :(得分:0)
它开箱即用的原因是因为类型pair<T,T>
没有定义散列函数而unordered_map
本质上是一个散列映射,所以它的键必须是可散列的
unordered_map<pair<int, int>, int>
没有任何根本性的错误。问题是您需要提供哈希函数和比较函数以实现相等。
有关<pair,pair>
作为关键字的具体案例,请参阅this question,有关一般案例的详细信息,请参见this answer。
答案 1 :(得分:0)
您可以定义自定义哈希函数:
#include <unordered_map>
typedef std::pair<int,int> int_pair;
class MyHashFunc {
std::hash<int> int_hash_func;
public:
long operator()(const int_pair &k) const{
return (int_hash_func(k.first) << 16) + (int_hash_func(k.second));
}
};
int main() {
std::unordered_map<int_pair, int, MyHashFunc> m;
return 0;
}
答案 2 :(得分:-1)
如果您可以提供一种从pair<int, int>
生成哈希的方法,那么您可以使用它。
示例:
#include <unordered_map>
#include <utility>
using namespace std;
struct IntPairHash
{
size_t operator()(pair<int, int> const& p)
{
// If you have a 64 bit platform where sizeof(size_t) == 64
// and sizeof(int) == 32, you can use:
size_t h = p.second;
h <<= 32;
h += p.first;
return h;
// For other platforms, a more different approach to come up with
// a hash value for p must be devised.
}
};
void foo()
{
unordered_map<pair<int, int>, int, IntPairHash> a;
}