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());
是否可以为sort函数编写一个比较器,使v[i].first
按递增顺序排序,对于v[i].first
的类似值,v[i].second
按降序排序?
如: -
i / p:
13 10
44 15
13 15
13 99
6 45
o / p:
6 45
13 99
13 15
13 10
44 15
答案 0 :(得分:2)
当然,这很容易。
您需要做的就是使用此签名编写一个函数:
bool f(std::pair<int, int> lhs, std::pair<int, int> rhs);
当且仅当true
lhs < rhs
因此,根据您的条件,lhs
小于rhs
if:
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;
}
}
这可以更紧凑地编写,但我希望保持简单和可读性以获得重点。 :)
答案 1 :(得分:2)
这是一个紧凑的比较函数对象,可以执行您想要的操作:(使用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{});