排序具有多个排序标准的对象矢量

时间:2014-05-20 15:18:53

标签: c++ sorting object vector overloading

class Point2D
{
    friend ostream& operator<< (ostream&, const Point2D&);
    protected:
            int x;         //can sort by x
            int y;         //can sort by y
            double dist;   //can sort by dist

    public:  
            Point2D () {x=0; y=0;}              
            Point2D (int a, int b) {x=a; y=b;}      
            void setX (int);
            void setY (int);
            void setDist();
            double getDist() const;     
            int getX ();
            int getY ();

}

int main()
{
    vector<Point2D> vect;
    sort (vect.begin(), vect.end());

    //Print all vector elements
    for (int x=0; x<vect.size(); x++)
        cout <<  vect[x] << endl;      
}

我正在尝试使用sort对象矢量进行排序。

但是当我在上面运行我的代码时,我会收到很多重复的错误:

instantiated from here - sort (vect.begin(), vect.end());

我希望能够按 x,y或dist 排序。 我想我可能需要重载>==运算符才能使用C ++ std库提供的sort

重载代码怎么样?我知道如何重载像<<这样的ostream运算符来显示数据,但是在这种复杂的情况下,我们如何进行重载以便让我们使用sort

1 个答案:

答案 0 :(得分:5)

如果您的编译器支持C ++ 11,您可以执行以下操作:

vector<Point2D> vect;
// sort by x
sort (vect.begin(), vect.end(), [](Point2D const &a, Point2D const &b) { return a.getX() < b.getX(); });
// sort by y
sort (vect.begin(), vect.end(), [](Point2D const &a, Point2D const &b) { return a.getY() < b.getY(); });

注意,要使上述示例正常工作,您要么将成员函数getXgetY定义为const,要么从输入参数中删除const限定符lambdas。

如果您的编译器不支持C ++ 11,那么您可以定义如下的可比数字:

bool compare_x(Point2D const &a, Point2D const &b)
{
  return a.getX() < b.getX();
}

bool compare_y(Point2D const &a, Point2D const &b)
{
  return a.getY() < b.getY();
} 

并拨打sort,如下所示:

  // sort by x
  sort(vect.begin(), vect.end(), compare_x);
  // sort by y
  sort(vect.begin(), vect.end(), compare_y);