最近在编写关于激光SLAM的代码时,遇见了一个问题,想将Eigen::Array2i作为unordered_map的key。于是随手一写:
std::unordered_map<Eigen::Array2i, int> hitsCountMap;
std::unordered_map<Eigen::Array2i, int> missesCountMap;
编写时出现了错误:
error: use of deleted function ‘std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map() [with _Key = Eigen::Array<int, 2, 1>; _Tp = int; _Hash = std::hash<Eigen::Array<int, 2, 1> >; _Pred = std::equal_to<Eigen::Array<int, 2, 1> >; _Alloc = std::allocator<std::pair<const Eigen::Array<int, 2, 1>, int> >]’
88 | std::unordered_map<Eigen::Array2i, int> hitsCountMap;
原因是因为unordered_map
默认不能将 Eigen::Array2i
直接作为键类型使用,因为它没有默认的哈希函数和相等比较运算符。
于是自己重新hash函数:
struct Array2iHash {
std::size_t operator()(const Eigen::Array2i& arr) const {
// 自定义哈希函数
return std::hash<int>()(arr.x()) ^ std::hash<int>()(arr.y());
}
};
struct Array2iEqual {
bool operator()(const Eigen::Array2i& arr1, const Eigen::Array2i& arr2) const {
// 自定义相等比较运算符
return arr1.x() == arr2.x() && arr1.y() == arr2.y();
}
};
然后构造unordered_map:
std::unordered_map<Eigen::Array2i, int, Array2iHash, Array2iEqual> hitsCountMap;
std::unordered_map<Eigen::Array2i, int, Array2iHash, Array2iEqual> missesCountMap;
这样就能编译通过啦!如果对你有帮助,请点赞收藏哦,谢谢了!