如何解决从 map <<object>, int> 检索值表现出奇怪的行为
我正在重现我在项目中遇到的地图问题,或者我实现了以下调试代码。我无法从 Point2 对象中检索映射中的整数值作为键。 我已经实现了 Point2 对象的重载,如代码所示。 Point2对象按照_label的值排序。
map _mapExtendedPointToIntersectionLabel 的元素插入成功,但是第 116,120,124 和 128 行的行为很奇怪。他们应该将相应的 POint2 对象的值分配给相应的变量。
-line 116确实插入到地图中,如该图所示和label1的被设置为0,而不是获取其值27;
-其他 3 行只是将变量 label2、label3 和 label4 设置为 0 而不是值 17,47 和 37;
这是怎么回事?如果我做错了什么,我该如何修复它以获得所需的行为?
class Point2
{
private:
double _coordinates[2];
int _label = -2;
public:
Point2(const double x = 0.0,const double y = 0.0){_coordinates[0]=x;_coordinates[1]=y;}
int getFirstCoordinate() const{ return _coordinates[0];}
int getSecondCoordinate() const{ return _coordinates[1];}
int getPointLabel() const{ return _label;}
void setPointLabel(const int label){_label =label;}
friend bool operator< (const Point2& p1,const Point2& p2 ){
return p1._label < p2._label;
}
Point2& operator =(const Point2 &point)
{
_coordinates[0] = point.getFirstCoordinate();
_coordinates[1] = point.getSecondCoordinate();
_label = point.getPointLabel();
return *this;
}
Point2(const Point2 &p1){
_coordinates[0]=p1._coordinates[0];
_coordinates[1]=p1._coordinates[1];
_label = p1._label;
}
};
int main(){
Point2 _intersectionVertices[4];
_intersectionVertices[0]= Point2(10,20);
_intersectionVertices[1]= Point2(11,21);
_intersectionVertices[2]= Point2(12,21);
_intersectionVertices[3]= Point2(13,31);
Point2 p1 = Point2(10,20);
Point2 p2 = Point2(11,21);
Point2 p3 = Point2(12,31);
Point2 p4 = Point2(13,41);
p1.setPointLabel(1);
p2.setPointLabel(2);
p3.setPointLabel(3);
p4.setPointLabel(4);
int intersectionId ;
map<Point2,int>_mapExtendedPointToIntersectionLabel;
_mapExtendedPointToIntersectionLabel.insert(pair<Point2,int>(p1,27));
_mapExtendedPointToIntersectionLabel.insert(pair<Point2,int>(p2,17));
_mapExtendedPointToIntersectionLabel.insert(pair<Point2,int>(p3,47));
_mapExtendedPointToIntersectionLabel.insert(pair<Point2,int>(p4,37));
intersectionId = 0;
int label1 = _mapExtendedPointToIntersectionLabel[_intersectionVertices[intersectionId]]; //line 116 //I placed a debug point here
cout <<"Label1 is"<<label1<<endl;
intersectionId = 1;
int label2 = _mapExtendedPointToIntersectionLabel[_intersectionVertices[intersectionId]];//line 120
cout <<"Label2 is"<<label2<<endl;
intersectionId = 2;
int label3 = _mapExtendedPointToIntersectionLabel[_intersectionVertices[intersectionId]];//line 124
cout <<"Label3 is"<<label3<<endl;
intersectionId = 3;
int label4 = _mapExtendedPointToIntersectionLabel[_intersectionVertices[intersectionId]];//line 128
cout <<"Label4 is"<<label4<<endl;
cout<<"the end"<<endl;
return 0;
}
在第 116 行之前:
第 116 行之后:
解决方法
friend bool operator< (const Point2& p1,const Point2& p2 )
{
return p1._label < p2._label;
}
此自定义类的定义严格弱排序,用作映射中的键,比较每个类实例的 _label
值以确定其严格弱排序。
显示的代码通过 p1
的 p4
将 _label
初始化为唯一值,因此可以正确比较它们的唯一性。
但对于地图查找而言,它使用 _intersectionVertices
数组中的实例,这些实例的 _label
均具有其默认值 -2
。
就地图而言,来自 _intersectionVertices
数组的这些值都不在地图中。因为为了确定这一点,只有它们的 _label
被比较,原因如上所述。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。