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

时间:2016-11-18 19:44:36

标签: 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);
    }
}

我这样做是因为我想将其作为哈希映射的关键。

然后我做

std::unordered_map<Key, int> map = {{1.01, 2.02, 3.03}, 333};

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

2 个答案:

答案 0 :(得分:6)

尝试使用{{{1.01, 2.02, 3.03}, 333}}代替{{1.01, 2.02, 3.03}, 333}

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

答案 1 :(得分:5)

这里有很多问题。

首先,您还没有为Key类型定义哈希函数。要将Key用作unordered_map中的关键字,您需要一个等值运算符(您已经制作过)和一个std::hash的特化,您还没有完成了。所以你需要做这样的事情:

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

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

std::unordered_map<Key, int> map = {{{1.01, 2.02, 3.03}, 333}};

这编译了这些变化;请参阅this demo进行确认。