STL 5.list容器

5.1 双向循环链表

5.2 赋值、构造

5.3 删除方面,有个remove操作,是删除所有与elem匹配的元素

5.4 反转 reverse 质变算法

5.5 排序 sort

  5.5.1 默认从小到大,若想改变规则,写回调函数

  5.5.2 对于自定义类型,必须要指定排序规则

5.6 案例:给葫芦娃高级排序

  5.5.1测试代码:

 1 #include"iostream"
 2 #include"list"
 3 #include"algorithm"
 4 using namespace std;
 5 
 6 void printList(const list<int>& L)
 7 {
 8     for (list<int>::const_iterator it = L.begin(); it != L.end(); it++)
 9     {
10         cout << *it << " ";
11     }
12     cout << endl;
13 }
14 
15 bool myCompare(int v, int u)
16 {
17     return v > u;
18 }
19 
20 void test01()
21 {
22     list<int> myList;
23     list<int> myList2(10, 10);
24     list<int> myList3(myList2.begin(),myList2.end());
25     list<int> myList4(myList3);
26 
27     list<int> myList5;
28     myList5.push_back(10);
29     myList5.push_back(20);
30     myList5.push_back(30);
31     myList5.push_front(100);
32     myList5.push_front(200);
33     myList5.push_front(300);
34     //正序的
35     //300 200 100 10 20 30
36     for (list<int>::iterator it = myList5.begin(); it != myList5.end(); it++)
37     {
38         cout << *it << " ";
39     }
40     cout << endl;
41 
42     //逆序的
43     //30 20 10 100 200 300
44     for (list<int>::reverse_iterator it = myList5.rbegin(); it != myList5.rend(); it++)
45     {
46         cout << *it << " ";
47     }
48     cout << endl;
49 
50     myList5.insert(myList5.begin(), 1000);//插入操作所需的参数是迭代器
51     myList5.insert(myList5.end(), 300);
52     printList(myList5);
53 
54     myList5.remove(300);//移除操作:会将链表中值为参数的都移除(删除所有的匹配的)
55     printList(myList5);
56 }
57 
58 //反转与排序
59 void test02()
60 {
61     list<int> myList5;
62     myList5.push_back(10);
63     myList5.push_back(20);
64     myList5.push_back(30);
65     myList5.push_front(100);
66     myList5.push_front(200);
67     myList5.push_front(300);
68     
69     //反转是个质变算法
70     myList5.reverse();
71     printList(myList5);
72 
73     //排序
74     //所有系统提供的标准算法,使用的容器的提供的迭代器必须支持随机访问
75     //不支持随机访问的迭代器容器,内部会对应提供相应的算法接口
76     // myList5.sort(); 而不是 sort(myList5.begin(),myList5.end());
77     myList5.sort();  //默认的从小到大
78     
79     //修改为从大到小,需要提供回调函数
80     myList5.sort(myCompare);
81     printList(myList5);
82 }
83 
84 int main()
85 {
86     //test01();
87     test02();
88     system("pause");
89     return 0;
90 }

    5.5.2测试代码:

 1 #include"iostream"
 2 #include"list"
 3 #include"algorithm"
 4 #include"string"
 5 using namespace std;
 6 
 7 class Person
 8 {
 9 public:
10     string myname;
11     int myage;
12     int myheight;
13     Person(string name, int age, int height)
14     {
15         this->myname = name;
16         this->myage = age;
17         this->myheight = height;
18     }
19     ~Person()
20     {
21     };
22 };
23 
24 void printList(const list<Person>& L)
25 {
26     for (list<Person>::const_iterator it = L.begin(); it != L.end(); it++)
27     {
28         cout << "名字: " << it->myname << "年龄:" << it->myage << "身高:" << it->myheight << endl;
29     }
30     cout << endl;
31 }
32 
33 //两个排序条件选择:先看年龄,升序;年龄相同看身高,降序
34 bool mycompare(Person& p1, Person& p2)
35 {
36     if (p1.myage == p2.myage)
37     {
38         return p1.myheight > p2.myheight;
39     }
40     else
41     {
42         return p1.myage < p2.myage;
43     }
44 }
45 void test()
46 {
47     list<Person> L;
48 
49     Person p1("dawa", 30, 180);
50     Person p2("erwa", 27, 160);
51     Person p3("sanwa", 26, 158);
52     Person p4("siwa", 26, 194);
53     Person p5("wuwa", 26, 170);
54     Person p6("yeye", 90, 188);
55     Person p7("shejing", 90, 12);
56     Person p8("xiejiang", 80, 1099);
57 
58     L.push_back(p1);
59     L.push_back(p2);
60     L.push_back(p3);
61     L.push_back(p4);
62     L.push_back(p5);
63     L.push_back(p6);
64     L.push_back(p7);
65     L.push_back(p8);
66 
67     printList(L);
68 
69     cout << "排序后:" << endl;
70     L.sort(mycompare);
71     printList(L);
72 }
73 
74 int main()
75 {
76     test();
77     system("pause");
78     return 0;
79 }

 

posted @ 2020-03-24 10:58  一二三的三二一  阅读(101)  评论(0)    收藏  举报