地图v.s中允许的键类型unordered_map

时间:2014-05-16 06:18:59

标签: c++ c++11 stl

我理解,当从密钥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)性能的密钥类型对的哈希表。

3 个答案:

答案 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;
}