矢量<对<int,int>>的比较器

Comparator for vector<pair<int,int>>

本文关键字:int lt gt 比较器 矢量      更新时间:2023-10-16
vector<pair<int,int> > v;
for(i=0;i<5;i++){
    cin>>b>>c;
    v.push_back(make_pair(b,c));
}
sort(v.begin(),v.end());

是否有可能为排序函数编写比较器,使v[i].first按递增顺序排序,并且对于v[i].first的相似值,v[i].second按递减顺序排序?
如:-
我/p:

 13 10  
 44 15  
 13 15  
 13 99  
  6 45  

o/p:

 6 45  
 13 99  
 13 15  
 13 10  
 44 15 

这是一个紧凑的比较函数对象,可以满足您的要求:(使用c++ 11的特性)

struct Shivam {
    typedef std::pair<int, int> const& param_type;
    bool operator()(param_type lhs, param_type rhs) const {
        return std::tie(lhs.first, rhs.second) < std::tie(rhs.first, lhs.second);
    };
};

并像这样使用:

std::sort(std::begin(v), std::end(v), Shivam{});

当然,这很容易。

你所需要做的就是用这个签名写一个函数:

bool f(std::pair<int, int> lhs, std::pair<int, int> rhs);

函数当且仅当lhs < rhs

返回true

因此,根据您的标准,lhs小于rhs,如果:

  • lhs.first < rhs.first
  • lhs.first == rhs.first && lhs.second > rhs.second

把它们放在一起,就得到:

bool mycomparer(std::pair<int, int> lhs, std::pair<int, int> rhs) {
    if (lhs.first < rhs.first) {
        return true;
    }
    else if (lhs.first == rhs.first && lhs.second > rhs.second) {
        return true;
    }
    else {
        return false;
    }
}

这可以写得更紧凑,但我想保持它的简单和可读性,以理解这一点。:)