16.8.4【set容器的排序】
1 #include<iostream> 2 #include<cstdlib> 3 using namespace std; 4 #include<set> 5 #include<string> 6 7 8 /* 9 3.8.8 set容器的排序 10 11 学习目标:set容器默认排序规则为从小到大,掌握如何改变排序规则 12 主要技术点:利用仿函数,可以改变排序规则 13 */ 14 15 16 class MyCompare //内置数据类型指定排序规则 17 { 18 public: 19 //重载() 20 bool operator()(int num1, int num2) 21 { 22 //降序:令 前一数 > 后一数 23 return num1 > num2; 24 } 25 }; 26 27 28 void test388_1() //set存放内置数据类型 29 { 30 set<int> s1; 31 s1.insert(30); 32 s1.insert(10); 33 s1.insert(20); 34 s1.insert(50); 35 s1.insert(40); 36 //插入时默认已升序排序 37 for(set<int>::iterator it=s1.begin(); it!=s1.end(); it++) 38 { 39 cout << *it << " "; 40 } 41 cout << endl; 42 43 //指定降序 44 set<int, MyCompare> s2; //利用仿函数 45 s2.insert(30); 46 s2.insert(10); 47 s2.insert(20); 48 s2.insert(50); 49 s2.insert(40); 50 for(set<int, MyCompare>::iterator it=s2.begin(); it!=s2.end(); it++) 51 { 52 cout << *it << " "; 53 } 54 cout << endl; 55 } 56 57 58 class Person 59 { 60 public: 61 string name; 62 int age; 63 64 public: 65 Person(string _name, int _age) 66 { 67 this->name = _name; 68 this->age = _age; 69 } 70 }; 71 72 73 class MyComparePerson //自定义数据类型指定排序规则 74 { 75 public: 76 //重载() 77 bool operator()(const Person & p1, const Person & p2) 78 { 79 //降序:令 前一人年龄 > 后一人年龄 80 return p1.age > p2.age; 81 } 82 }; 83 84 85 void test388_2() //set存放自定义数据类型 86 { 87 //自定义数据类型一般都会事先手动指定排序规则 88 set<Person, MyComparePerson> s1; //利用仿函数 89 90 Person p1("tom", 30); 91 Person p2("sam", 25); 92 Person p3("amy", 30); 93 Person p4("ann", 19); 94 Person p5("liu", 22); 95 96 //直接插入时会报错,原因:set默认升序排序,但它自己不知道自定义数据类型的排序规则 97 s1.insert(p1); 98 s1.insert(p2); 99 s1.insert(p3); 100 s1.insert(p4); 101 s1.insert(p5); 102 103 for(set<Person>::iterator it=s1.begin(); it!=s1.end(); it++) 104 { 105 cout << "name:" << (*it).name << " age:" << it->age << endl; 106 } 107 /* 108 name:tom age:30 109 name:sam age:25 110 name:liu age:22 111 name:ann age:19 112 注意没有name:amy age:30,因为年龄重复了,而此时指定的规则只按照年龄排序,且set中不存在重复数据 113 */ 114 } 115 116 117 int main() 118 { 119 test388_1(); 120 test388_2(); 121 122 system("pause"); 123 return 0; 124 }