【问题标题】:Sort vector of objects with multiple sorting criteria具有多个排序标准的对象的排序向量
【发布时间】:2014-07-08 22:54:33
【问题描述】:
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 进行排序。 我想我可能需要重载&gt;== 运算符才能使用C++ 标准库提供的sort

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

【问题讨论】:

    标签: c++ sorting object vector overloading


    【解决方案1】:

    如果你的编译器支持 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 定义为 consts,或者从 lambda 的输入参数中删除 const 限定符。

    如果您的编译器不支持 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);
    

    【讨论】:

    • 所以我真的不需要为了使用 C++ stdlib 的sort而进行重载?
    • 不,你不需要超载。
    • 当我运行你建议的代码时,我得到expected primary-expression before '[' and ']' and 'const'
    • @user3437460 等一下。
    • @40two 我认为添加一个不依赖于 C++11 的解决方案会很有帮助,因为 OP 标记为 C++,而不是 C++11。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-03
    • 2016-04-15
    • 1970-01-01
    • 1970-01-01
    • 2011-04-11
    相关资源
    最近更新 更多