从地图 <<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 值以确定严格弱排序订购。

显示的代码将 p1p4_label 初始化为唯一值,因此可以正确比较它们的唯一性。

但对于地图查找而言,它使用 _intersectionVertices 数组中的实例,它们的 _label 都具有默认值 -2.

就地图而言,_intersectionVertices 数组中的 none 个值在地图中。因为要确定这一点,出于上述原因,只有他们的 _label 会进行比较。