Вектор сортировки пар с целыми и точками - PullRequest
0 голосов
/ 24 мая 2019

У меня есть некоторые проблемы с сортировкой моих векторов. Я хочу отсортировать свои векторы по первому элементу, который является Number.Can кто-нибудь объяснить мне, что я делаю неправильно и что означают эти 2 ошибки?

Я пытаюсь сортироватьэто с функцией сравнения и без нее, и ничего не работает.

struct Point{
    int x;
    int y;
};

bool compare(int a,int b){
     return a < b;
}

int main()
{
int N,Number,x,y;

cin >> N;
vector<pair<int,Point>> p;
for(int i = 0 ; i < N ; i++){
    cin >> Number >> x >> y;
    pair<int,Point> pom = {Number,{x,y}};
    p.push_back(pom);
    }
//    sort(p.begin(),p.end());
//    sort(p.begin().p.end(),compare);
return 0;
}

У меня есть две ошибки, но я не знаю, что означает:
1.не совпадает с 'operator <' (типы операндовявляются «const Point» и «const Point») <br>||(! (__ y.first <__x.first) && __x.second <__y.second);} <br>2. тело функции constexpr 'constexpr bool std :: operator <(const std :: pair <_T1, _T2> &, const std :: pair <_T1, _T2> &) [with _T1 = int;_T2 = Точка] 'не является оператором возврата
||(! (__ y.first <__x.first) && __x.second <__y.second);} ^ ^ </p>

1 Ответ

2 голосов
/ 24 мая 2019

Компаратор для int s бесполезен и, вероятно, не определено.Компилятор знает, как сравнивать два целых числа, это часть языка.Он также знает, как сравнить два экземпляра std::pair.Чего он не знает, так это того, как сравнить два экземпляра класса Point, который определяется вами.

По сути, у вас есть два варианта:

1.Укажите operator< для Point

Это позволит вам впоследствии легко сравнить две точки в любой ситуации:

bool operator<(const Point& p1, const Point& p2) {
    if (p1.x == p2.x) 
    {
        return p1.y < p2.y;
    }
    return p1.x < p2.x;
}    

2.Предоставьте компаратор на месте для std::sort Это быстрое решение, если вам нужно только сравнить материал для сортировки.

std::sort(p.begin(), p.end(), [](const auto& p1, const auto& p2) {
    //whatever logic it takes to compare two std::pair<int, Point>
});

Примечание: Общая лямбда (сconst auto& в качестве аргументов) является функцией C ++ 14.Сами лямбды - это функция C ++ 11.

Выбор между ними зависит от использования.Если вам просто нужно отсортировать вектор, или если логика сортировки необычна, выберите компаратор std::sort.Если вы хотите всегда сравнивать два Point с одинаковым образом, перейдите к перегрузке оператора.

...