std :: vector и алгоритма :: sort, что не так со следующим кодом - PullRequest
0 голосов
/ 06 июня 2011

Я пытаюсь сортировать 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 ]

4 голосов
/ 06 июня 2011

Ваша функция сравнения всегда возвращает true!

2 голосов
/ 06 июня 2011

Ваши функции сравнения всегда возвращают true.Возвращение ложного иногда может быть хорошей идеей.И (если быть серьезным) сравнение (xy) координат не так тривиально, как может показаться - вы, вероятно, захотите немного подумать, прежде чем его реализовать.

1 голос
/ 06 июня 2011

Если вы используете 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 (как уже упоминалось)

  • сравнитьY используйте <= вместо <. Это плохая идея, потому что стандартные алгоритмы (включая сортировку) ожидают менее семантической (не less_or_equal-семантической).

0 голосов
/ 06 июня 2011

Перегрузка оператора '<' для класса <code>Point.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...