c++hash地图里能否重写判断hashcode是否相等的函数吗?代码如下
c++hashmap里能否重写判断hashcode是否相等的函数吗?代码如下
个人理解每个对象分配一个hashcode,先判断是否相等,相等的话再执行比较函数,不相等就不会执行比较函数了。我能否自己写判断hashcode是否相等的方法,让我想要的对象执行比较函数。
这里我是想在在一个保存坐标的数组里找出所有坐标值相差距离小于3的点集,如(220,119),(220,220),(119,220)是属于一个点集,
判断依据是abs(a.x - b.x) + abs(a.y - b.y) < 3(a,b是点坐标),每一个元素和其他元素各自进行比较,然后保存点集
在这程序里我想通过判断hashcode是否相等来找点集,相等依据就是abs(a.x - b.x) + abs(a.y - b.y) < 3,但是hashmap默认相同的对象才有相同的hashcode,所以我没办法,只能让所有点拥有相同的hashcode,就是1,然后进入比较函数里进行点比较,但这样效率太低,比较函数效率远远低于hash函数里判断hashcode是否相等,所有我想问是否能重写判断hashcode相等的函数方法。
如果不能,我还有什么方法可以实现我的功能,这里考虑点坐标有上万个,之前我用的是嵌套for循环,点坐标两两比较,能实现但是效率太低,别人让我试试hashmap,然后我就碰到这种问题了,hashmap找相同的元素的确可以实现,但是像我这样,一定范围里的点也当作相等的,不知道怎么做了
------解决思路----------------------
谢谢赵老师回答,但是可以直接修改源码吗,如果修改源码,我下次再新建一个项目再调用到这个源码,我不就变成上次的功能了,或者说别人导入我的项目,也不能正常运行吧,他的源码没有改,请指导一下,谢谢
个人理解每个对象分配一个hashcode,先判断是否相等,相等的话再执行比较函数,不相等就不会执行比较函数了。我能否自己写判断hashcode是否相等的方法,让我想要的对象执行比较函数。
这里我是想在在一个保存坐标的数组里找出所有坐标值相差距离小于3的点集,如(220,119),(220,220),(119,220)是属于一个点集,
判断依据是abs(a.x - b.x) + abs(a.y - b.y) < 3(a,b是点坐标),每一个元素和其他元素各自进行比较,然后保存点集
在这程序里我想通过判断hashcode是否相等来找点集,相等依据就是abs(a.x - b.x) + abs(a.y - b.y) < 3,但是hashmap默认相同的对象才有相同的hashcode,所以我没办法,只能让所有点拥有相同的hashcode,就是1,然后进入比较函数里进行点比较,但这样效率太低,比较函数效率远远低于hash函数里判断hashcode是否相等,所有我想问是否能重写判断hashcode相等的函数方法。
如果不能,我还有什么方法可以实现我的功能,这里考虑点坐标有上万个,之前我用的是嵌套for循环,点坐标两两比较,能实现但是效率太低,别人让我试试hashmap,然后我就碰到这种问题了,hashmap找相同的元素的确可以实现,但是像我这样,一定范围里的点也当作相等的,不知道怎么做了
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
#include <math.h>
#include <string>
using std::string;
#include <unordered_map>
using std::unordered_multimap;
using namespace std;
using namespace cv;
class StrHash{
public:
size_t operator()(const Point a) const {
return 1;
}
};
class StrCompare{
public:
bool operator()(const Point& a, const Point& b) const {
if (abs(a.x - b.x) + abs(a.y - b.y) < 3) {
return true;
}
else
return false;
}
};
int main()
{
unordered_multimap<Point, int, StrHash, StrCompare> map;
map.insert(make_pair(Point(30, 120), 1));
map.insert(make_pair(Point(220, 120), 2));
map.insert(make_pair(Point(220, 120), 3));
map.insert(make_pair(Point(220, 120), 4));
map.insert(make_pair(Point(220, 119), 5));
map.insert(make_pair(Point(30, 120), 6));
unordered_multimap<Point, int, StrCompare>::iterator iter1;
unordered_multimap<Point, int, StrCompare>::iterator iter2;
for (iter1 = map.begin(); iter1 != map.end();)//遍历
{
int num = map.count((*iter1).first);
iter2 = map.find((*iter1).first);
if (num > 2) {
for (int i = 1; i <= num; i++)
{
cout << (*iter2).first << " " << i << endl;
iter2++;
}
iter1++;
}
else {
iter1++;
}
}
}
------解决思路----------------------
谢谢赵老师回答,但是可以直接修改源码吗,如果修改源码,我下次再新建一个项目再调用到这个源码,我不就变成上次的功能了,或者说别人导入我的项目,也不能正常运行吧,他的源码没有改,请指导一下,谢谢