我正在尝试构建一个unordered map
来包含n维中的点
空间。我理解std::vector
满足std::map
中作为键的所有要求,但此代码无法编译。我得到了一长串错误消息,但这似乎是最成问题的:
error: no match for call to ‘(const std::hash<std::vector<int> >) (const std::vector<int>&)'.
有没有人知道为什么g ++似乎不认为std::vector<int>
可以播放?
#include <vector>
#include <unordered_map>
#include <boost/functional/hash.hpp>
using namespace std;
typedef vector<int> point;
int main()
{
unordered_map<point, int>jugSpace;
vector<int> origin(3, 0);
jugSpace.insert( pair<point,int>(origin, 0) );
}
答案 0 :(得分:4)
无序映射需要密钥的哈希函数的可用性。标准实现中std::vector
不存在此类函数。
你可以使用std::map
- 它需要比较运算符,它存在于vector。
如果你真的必须使用vector作为哈希映射的关键(看起来很可疑),你应该自己实现哈希函数。
答案 1 :(得分:4)
您需要为您的观点专门化模板类std::hash<>
,如:
namespace std {
template<>
class hash<point> {
public:
size_t operator()(const point &p) const {
// put here your hash calculation code
}
};
}
或创建自定义hasher类并将其类型指定为std::unordered_map
的模板成员:
class my_hash {
public:
size_t operator()(const point &p) const {
// your hash calculation code
}
};
// somewhere in your code, where you declare your unordered_map variable
std::unordered_map<point, int, my_hash> myUnorderedMap;
如果你想使用boost::hash_value
作为哈希函数,那么只需在你的哈希实现中返回它的结果,例如:
class my_hash {
public:
size_t operator()(const point &p) const {
return boost::hash_value(p);
}
};