STL向量排序

STL Vector sort

本文关键字:排序 向量 STL      更新时间:2023-10-16
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
struct point{
    int index;
    int x;
    int y;
};

以x为基数比较,以y为基数打破平局!!

bool comp1(const point& p1,const point& p2){
    if(p1.x<p2.x)
        return true;
    if(p1.x==p2.x){
        if(p1.y<p2.y)
            return true;
    return false;
    }
    return true;
}

以y为基数比较,以x为基数打破平局!!

bool comp2(const point &p1,const point &p2){
    if(p1.y<p2.y)
        return true;
    if(p1.y==p2.y){
        if(p1.x<p2.x)
            return true;
    }
    return false;
}
int main() {
        int n;
        vector<point> px,py;
        cin>>n;
        point p;
        for(int i=0;i<n;i++){
            cin>>p.x>>p.y;
            p.index = i+1;
            px.push_back(p);
            py.push_back(p);
        }
        sort(px.begin(),px.end(),comp1);
        sort(py.begin(),py.end(),comp2);
        vector<point>::iterator it;
        for(it=px.begin();it!=px.end();it++)
            cout<<it->x<<" "<<it->y<<"t";
        cout<<endl;
        for(it=py.begin();it!=py.end();it++)
            cout<<it->x<<" "<<it->y<<"t   ";
        cout<<endl;
    return 0;
}

上面的代码产生了模棱两可的结果。我试图在增加x的基础上排序点,而不是增加y,反之亦然。

您可以通过使用std::pair()的内置operator<来简化逻辑,它可以进行字典比较:

bool comp1(const point& p1,const point& p2){
  return std::make_pair(p1.x, p1.y) < std::make_pair(p2.x, p2.y);
}
// swap x and y order for comp2
bool comp2(const point& p1,const point& p2){
  return std::make_pair(p1.y, p1.x) < std::make_pair(p2.y, p2.x);
}