std :: vector和algorithm :: sort,以下代码有什么问题

时间:2011-06-06 19:44:33

标签: c++ stl vector

我正在尝试使用std::vector排序algorithm::sort,但我收到运行时错误 Invalid operator <

以下是我的代码。

struct Point {
    double x_cord;
    double y_cord;
    int id;
    Point(int d, double x, double y) {
        x_cord = x;
        y_cord = y;
        id = d;
    }
};

struct compareX {
    bool operator ()(Point * left, Point* right) const {
        if (left->x_cord < right->x_cord) 
            return true;
        return true;
    }
};
struct compareY {
    bool operator ()(Point * left, Point* right) const {
        if (left->y_cord <= right->y_cord) return true;
        return true;
    }
};

现在我在填充值后调用它。

std::sort( posVector.begin(), posVector.end(), compareX());

4 个答案:

答案 0 :(得分:4)

您的比较函数始终返回true!

答案 1 :(得分:2)

您的比较函数似乎总是返回true。偶尔返回错误可能是个好主意。并且(严肃地说)比较(x.y)坐标并不像它看起来那么简单 - 你可能想在实现它之前考虑一下。

答案 2 :(得分:1)

如果您使用std::vector<Point>,则必须

struct compareX {
    bool operator ()(const Point& left, const Point& right) const {
        return left.x_cord < right.x_cord;
    }
};
struct compareY {
    bool operator ()(const Point& left, const Point& right) const {
        return left->y_cord < right->y_cord;
    }
};

您的代码存在问题

  • 比较类接受指针而不是被排序的对象(如果std::vector<Point>已排序,即不是std::vector<Point*>)。如果你正在排序指针的矢量,那就没关系了。

  • 比较类包含错误输入 - 总是返回true(如前所述)

  • compareY使用<=代替<。这是个坏主意,因为标准算法(包括排序)期望语义较少(而不是less_or_equal-语义)。

答案 3 :(得分:0)

重载'&lt;' Point类的运算符。