unordered_map的配对密钥

时间:2018-08-25 07:06:11

标签: c++ c++11 unordered-map std-pair

#include <bits/stdc++.h>

std::unordered_map<std::pair<int,int>, int> mp;

int main()
{
    mp[make_pair(1, 2)]++;
}

使用[] operator时,我得到了

 error: no match for ‘operator[]’ (operand types are ‘std::unordered_map<std::pair<int, int>, int>’ and ‘std::pair<int, int>’)

但是,对std::map执行相同操作时,不会发生错误。为什么? 而我该如何使其与std::unorderd_m一起使用?

1 个答案:

答案 0 :(得分:4)

  

std::map执行相同操作时,不会发生错误。为什么?我怎么能   使它与std::unorderd_map兼容吗?

因为它们完全不同。

std::unorderd_map元素是根据其键的哈希值放置的。

template<
    class Key,
    class T,
    class Hash = std::hash<Key>,  
    class KeyEqual = std::equal_to<Key>,
    class Allocator = std::allocator< std::pair<const Key, T> >
> class unordered_map;

std::map仅需要比较功能即可对键进行排序。

template<
    class Key,
    class T,
    class Compare = std::less<Key>,
    class Allocator = std::allocator<std::pair<const Key, T> >
> class map;

std::map<std::pair<int,int>, int>被编译的原因是为std::pair定义了operator< ,并且std::map使用它来对其键进行排序,而尚未定义std::pair 哈希函数 ,因此std::unorderd_map需要一个将元素存储在其存储桶中的功能。您需要定义它。

例如,您可以定义自定义哈希函数,如下所示:

#include <unordered_map>
#include <cstddef>
#include <functional>

struct CustomHash
{
  template <typename T, typename U>
  std::size_t operator()(const std::pair<T, U> &x) const
  {
    return std::hash<T>()(x.first) ^ std::hash<U>()(x.second);
  }
};

int main()
{
    std::unordered_map<std::pair<int,int>, int, CustomHash> mp;
    mp[std::make_pair(1, 2)]++;
    return 0;
}

PS #include <bits/stdc++.h>是不好的编码习惯。为什么?参见this