我有一个结构
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};'
答案 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进行确认。