STL sort实现可迭代容器中对象的多重标准排序
1 #include <iostream>
2 #include <string>
3 #include <vector>
4 #include <algorithm>
5
6 using namespace std;
7
8 class Cat{
9 public:
10 int id;
11 string name;
12 int age;
13 Cat(int i,string n,int a){
14 id = i;
15 name =n;
16 age = a;
17
18 }
19 };
20
21 /*
22 实现自己的比较函数:
23 格式:
24 bool compName(Obj1, Obj2);
25 注意:
26 1. 函数必须返回bool值
27 2. 函数如果返回true就表示该参数或者标准按这种顺序排序(即不用swap),返回false即会swap
28 3. 函数作为sort(beginIndex,endIndex,compName)的第三个参数;
29
30 */
31 bool myCompare(Cat *a,Cat* b){
32 //先按id从小到大排序
33 if(a->id<b->id)return true;
34 else if(a->id>b->id)return false;
35 else {
36 //id相同
37 //按name的字典序排序
38 if(a->name.compare(b->name)<0)return true;
39 else if(a->name.compare(b->name)>0)return false;
40 else{
41 //name相同,按age从小到大排序
42 if(a->age<b->age)return true;
43 if(a->age>b->age)return false;
44 else{
45 //age也相同
46 //返回true
47 return true;
48 }
49 }
50
51 }
52 }
53
54
55 int main(){
56 vector<Cat*> v ;
57 v.push_back(new Cat(1,"Jim",1));
58 v.push_back(new Cat(1,"Jima",1));
59 v.push_back(new Cat(1,"Jimb",1));
60 v.push_back(new Cat(1,"Jimc",1));
61 v.push_back(new Cat(1,"J",1));
62 v.push_back(new Cat(2,"Jim",1));
63 v.push_back(new Cat(2,"Jizzz",1));
64 v.push_back(new Cat(2,"Jim",2));
65 v.push_back(new Cat(2,"Jim",3));
66 sort(begin(v),end(v),myCompare);
67 for(int i=0;i<v.size();i++){
68 Cat * c = v[i];
69 cout<<c->id<<" "<<c->name<<" "<<c->age<<endl;
70 }
71
72 }
73
74 /*
75 output:
76 1 J 1
77 1 Jim 1
78 1 Jima 1
79 1 Jimb 1
80 1 Jimc 1
81 2 Jim 1
82 2 Jim 2
83 2 Jim 3
84 2 Jizzz 1
85
86 */