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 }

 

 

posted @ 2021-05-12 11:19  yub4by  阅读(115)  评论(0编辑  收藏  举报