为什么unordered_map说没有匹配的构造函数用于初始化?

pok*_*che -6 c++ c++11

我有一个结构

struct Key {
    double x;
    double y; 
    double z;

    bool operator==(const Key& k) const{
      return (x == k.x && y == k.y && z == k.z);
    }
}
Run Code Online (Sandbox Code Playgroud)

我这样做是因为我想把它作为哈希映射的关键.

然后我做

std::unordered_map<Key, int> map = {{1.01, 2.02, 3.03}, 333};
Run Code Online (Sandbox Code Playgroud)

我想使用初始化列表作为构造函数,但我得到错误 no matching constructor for initialization of 'std::unordered_map<key, int> map = {{1.01, 2.02, 3.03}, 333};'

Yak*_*ont 6

尝试{{{1.01, 2.02, 3.03}, 333}}而不是{{1.01, 2.02, 3.03}, 333}

可以使用元素列表初始化容器,而不是如何构造一个元素的说明.

  • 钥匙不可清洗.我想这就是原因. (2认同)
  • @EdgarRokyan我看不出钥匙不耐用的证据.其他地方可能存在`std :: hash`特化; 并且,如果没有,它不可清除不会触发编译器错误. (2认同)
  • @Yakk是的,额外的花括号解决了这个问题. (2认同)

tem*_*def 5

这里有很多问题.

首先,您尚未为您的Key类型定义哈希函数.要Key用作a中的键unordered_map,你需要一个相等的运算符(你已经做过)和一个std::hash你尚未完成的特化.所以你需要做这样的事情:

namespace std {
    template <> struct hash<Key> {
        unsigned operator()(const Key& arg) const {
            return /* some hash code */
        }       
    };
}
Run Code Online (Sandbox Code Playgroud)

其次,初始化列表中的括号级别太少.期望的初始化列表是键/值对的列表,因此如果要使用单个键值对作为初始地图内容,则需要额外的大括号:

std::unordered_map<Key, int> map = {{{1.01, 2.02, 3.03}, 333}};
Run Code Online (Sandbox Code Playgroud)

这编译了这些变化; 看这个演示确认.