从地图 <<object>, int> 中检索值表现出奇怪的行为
Retrieving values from map <<object>, int> exhibits strange behavior
我正在重现我在项目中遇到的地图问题,或者我实现了以下调试代码。我在从 Point2 对象作为键检索地图中的整数值时遇到问题。
我已经实现了 Point2 对象的重载,如代码所示。 Point2对象根据_label的值排序。
地图 _mapExtendedPointToIntersectionLabel 成功插入其元素,但第 116、120、124 和 128 行的行为 strangely.They 应该只是将相应的 POint2 对象的值分配给相应的变量。
-第116行做了一个插入到map中,如图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;
}
此自定义 class 定义的严格弱排序,在映射中用作键,比较每个 class 实例的 _label
值以确定严格弱排序订购。
显示的代码将 p1
到 p4
的 _label
初始化为唯一值,因此可以正确比较它们的唯一性。
但对于地图查找而言,它使用 _intersectionVertices
数组中的实例,它们的 _label
都具有默认值 -2
.
就地图而言,_intersectionVertices
数组中的 none 个值在地图中。因为要确定这一点,出于上述原因,只有他们的 _label
会进行比较。
我正在重现我在项目中遇到的地图问题,或者我实现了以下调试代码。我在从 Point2 对象作为键检索地图中的整数值时遇到问题。 我已经实现了 Point2 对象的重载,如代码所示。 Point2对象根据_label的值排序。
地图 _mapExtendedPointToIntersectionLabel 成功插入其元素,但第 116、120、124 和 128 行的行为 strangely.They 应该只是将相应的 POint2 对象的值分配给相应的变量。
-第116行做了一个插入到map中,如图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;
}
此自定义 class 定义的严格弱排序,在映射中用作键,比较每个 class 实例的 _label
值以确定严格弱排序订购。
显示的代码将 p1
到 p4
的 _label
初始化为唯一值,因此可以正确比较它们的唯一性。
但对于地图查找而言,它使用 _intersectionVertices
数组中的实例,它们的 _label
都具有默认值 -2
.
就地图而言,_intersectionVertices
数组中的 none 个值在地图中。因为要确定这一点,出于上述原因,只有他们的 _label
会进行比较。