具有int和Points的对的排序向量

时间:2019-05-24 17:26:05

标签: c++ sorting vector std-pair

我在对向量进行排序时遇到一些问题。我想根据第一个元素对数字进行排序,编号是Number。有人可以向我解释我做错了什么以及这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')
 || (!(__ y.first <__x.first)&& __x.second <__y.second); }
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); }                                                                  ^                                                   ^

1 个答案:

答案 0 :(得分:2)

int的比较器是无用的,并且可能是未定义的行为。编译器知道如何比较两个整数,这是语言的一部分。它还知道如何比较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>
});

注意:通用lambda(以const auto&作为参数)是C ++ 14的功能。 Lambda本身就是C ++ 11的功能。

以上选择取决于使用情况。如果只需要对向量进行排序,或者排序逻辑不正常,请使用std::sort比较器。如果您想始终以相同的方式比较两个Point,请进行运算符重载。