以下是我的代码。操作功能无法正常工作。任何帮助将不胜感激。通常,sort
按升序排序。我想定义操作,以便按降序排序
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<utility>
using namespace std;
typedef pair<int,int> pii;
typedef pair<int,pii> pwp;
bool operat(pwp a, pwp b){
if(a.first > b.first){
return true;
}else if(a.second.first > b.second.first) {
return true;
}else if (a.second.second > b.second.second) { return true;}
return false;
}
int main(){
vector<pwp> inp;
pwp obj1 = make_pair(1998,make_pair(3,24));
pwp obj2 = make_pair(1998,make_pair(3,21));
pwp obj3 = make_pair(1997,make_pair(3,24));
inp.push_back(obj1);
inp.push_back(obj2);
inp.push_back(obj3);
printf("Before sorting\n");
for(int i = 0 ; i< inp.size();i++){
pwp sth = inp[i];
printf("%d %d %d\n",sth.first,sth.second.first,sth.second.second);
}
sort(inp.begin(), inp.end(),operat);
cout<<"After soring"<<endl;
for(int i = 0 ; i< inp.size();i++){
pwp sth = inp[i];
printf("%d %d %d\n",sth.first,sth.second.first,sth.second.second);
}
return 0;
}
新人:
bool operat(pwp a, pwp b){
if(a.first > b.first){
return true;
}else if(a.first < b.first) return false;
else if(a.second.first > b.second.first) {
return true;
}else if (a.second.first < b.second.first) return false;
else if (a.second.second > b.second.second) { return true;}
return false;
}
答案 0 :(得分:4)
std::pair附带比较运算符,如果其模板参数具有这些运算符,则可以使用它们。因此,您只需使用std::greater实例作为比较函数:
#include <functional> // for std::greater
operat = std::greater<pwp>();
std::sort(inp.begin(), inp.end(),operat);
如果因任何原因使用std::greater
太令人生畏,那么可以选择定义函数operat
:
bool operat(const pwp& a, const pwp& b){ return a > b; }
如果你坚持自己实施词汇比较逻辑,那么我建议如下:而不是考虑如何正确比较std::pair<int, std::pair<int, int>>
,找出如何比较{{1} } 一般来说。然后在std::pair<T1,T2>
。
答案 1 :(得分:2)
在您的代码中:
bool operat(pwp a, pwp b){
if(a.first > b.first){
return true;
}else if(a.second.first > b.second.first) {
return true;
}else if (a.second.second > b.second.second) { return true;}
return false;
}
第二次比较只应在a.first == b.first时执行,第三次只在a.second.first == b.second.first
时执行