Queue是一种先进先出的数据结构,队列容器只允许从一端进,另一端出;只有两端的元素才能被外界使用。

 1 queue<int>q
 2 //入队,从队尾添加元素
 3 q.push(1);
 4 q.push(2);
 5 q.push(3)
 6 //出队,从队头删除元素
 7 q.pop();
 8 //返回最后一个元素
 9 q.back();
10 //返回第一个元素
11 q.front();
12 //判断是否为空
13 q.empty();
14 //队列的大小
15 q.size();

List容器

  是一个链表结构的容器,是一个双向循环链表。优点是插入删除速度快,缺点是存取效率相比数组效率低。

  (1)构造函数

    

1 //1、默认构造
2 list<int>L1;
3 //2、区间方式构造
4 list<int> L2(L1.begin(),L2.end());
5 //3、n个元素
6 list<int>L3(3,1);
7 //4、拷贝构造
8 list<int> L4(L3);

  (2) 赋值操作

 1 list<int>L1;
 2 
 3 L1.push_back(1);
 4 L1.push_back(2);
 5 
 6 list<int>L2;
 7 //等号赋值
 8 L2=L1;
 9 
10 //assign方式赋值
11 list<int>L3;
12 //L3.assgin(L2.begin(),L3.end());
13 L3.assign(10,100);//10个100

  (3)两个容器的交换操作

 1 list<int> L1;
 2 L1.push_back(2);
 3 L1.push_back(3);
 4 L1.push_back(4);
 5 L1.push_back(5);
 6 
 7 list<int> L2;
 8 L2.assgin(10,100);
 9 //互换
10 L1.swap(L2);

  (4)list容器的大小操作

1 list<int >L1;
2 //返回容器大小
3 L1.size();
4 //判断容器是否为空
5 L1.empty();
6 //重新指定容器大小为10,如果容器变长,默认以0填充,如果变短,超出部分截断
7 L1.resize(10);
8 //指定2来填充
9 L1.resize(10,2);

  (5)插入和删除操作

 1 list<int>L1;
 2 //尾插
 3 L1.push_back(10);
 4 L1.push_back(20);
 5 L1.push_back(30);
 6 L1.push_back(40);
 7 //头插
 8 L1.push_front(0);
 9 //遍历
10 for (list<int> ::iterator it = L1.begin(); it != L1.end();it++)
11     {
12         cout << (*it) << " ";
13     }
14     cout << endl;
15 //0 10 20 30 40
16 //头删
17 L1.pop_front();
18 //尾删
19 L1.pop_back();
20 
21 //10 20 30 
22 
23 //插入
24 list<int>::iterator it = L1.begin();
25 L1.insert(++it,12); //偏移一个位置
26 L1.insert(it,12);
27 //10 12 12 20 30
28 //重新定义一个迭代器
29 list<int>::iterator it2 = L1.begin();
30 L1.erase(it2);//删除第一个
31 //12 12 20 30
32 //删除所有值为12的元素
33 L1.remove(12);
34 //20 30
35 
36 L1.clear();//清空

  (6)list数据的存取

    list内部是一个链表,地址不连续,不支持随机存取,因此不能使用[],at()进行访问。

 1 list<int >L1;
 2 L1.push_back(0);
 3 L1.push_back(1);
 4 L1.push_back(2);
 5 L1.push_back(3);
 6 
 7 //访问第一个元素
 8 L1.front();
 9 //访问最后一个元素
10 L1.back();

  (7)翻转和排序

 1 list<int> L1;
 2 L1.push_back(3);
 3 L1.push_back(1);
 4 L1.push_back(4);
 5 L1.push_back(3);
 6 L1.push_back(2);
 7 // 3 1 4 3 2
 8 L1.reverse();
 9 //2 3 4 1 3
10 //排序,默认升序
11 L1.sort();
12 //1 2 3 3 4
1 //降序
2 bool myCompare(int v1,int v2)
3 {
4        return v1>v2;    
5 }
6 L1.sort(myCompare);
7 //4 3 3 2 1

  案例:自定义数据类型的排序

 1 class Person{
 2 public:
 3     Person(string name, int age,int heigh){
 4         this->m_Name = name;
 5         this->m_Age = age;
 6         this->m_Heigh = heigh;
 7     }
 8     string m_Name;
 9     int m_Age;
10     int m_Heigh;
11 };
12 bool myCompare(Person &p1,Person &p2){
13     //按年龄升序 如果年龄相等身高降序
14     if (p1.m_Age==p2.m_Age)
15     {
16         return p1.m_Heigh > p2.m_Heigh;
17     }
18     else
19     {
20         return p1.m_Age < p2.m_Age;
21     }
22 }
23 void test01(){
24     list<Person> L;
25     Person p1("tom", 20, 170);
26     Person p2("liming", 22, 180);
27     Person p3("jenny", 22, 160);
28     Person p4("hauhua", 21, 177);
29     L.push_back(p1);
30     L.push_back(p2);
31     L.push_back(p3);
32     L.push_back(p4);
33     printList1(L);
34     //tom 20 170
35     // liming 22 180
36     //jenny 22 160
37     //huahua 21 177      
38     L.sort(myCompare);   //按年龄升序 如果年龄相等身高降序
39     printList2(L);
40     //tom 20 170
41     //huahua 21 177
42     //liming 22 180
43     //jenny 22  160
44           
45 }

 

set/multiset容器

  所有元素在插入时自动排序,是关联式容器,底层结构是二叉树。set容器不允许有重复元素,multiset容器允许有重复元素。

  因为set容器在插入成功时,会返回一个对组。记录是否插入成功。

  

1 set<int>s1;
2 pair <set<int>::iterator ,bool> ret=s1.insert(1);
3 //参数1表示插入的迭代器,参数2表示插入是否成功 通过ret.second,可以拿到参数2,如果为真,表示插入成功。

 

  (1)构造和赋值操作

    

1 //默认构造
2 set <int> s1;
3 //拷贝构造
4 set<int >s2(s1);
5 //赋值
6 set<int>s3;
7 s3=s2;

  (2)交换和大小操作

1 set<int> s1;
2 set<int> s2;
3 //返回大小
4 s1.size();
5 //是否为空
6 s1.empty();
7 
8 //交换
9 s1.swap(s2);

  (3)插入和删除操作

 1 set<int>s1;
 2 //插入
 3 s1.insert(4);
 4 s1.insert(1);
 5 s1.insert(3);
 6 s1.insert(8);
 7 // 1 3 4 8
 8 s1.erase(s1.begin());  //删除的是1
 9 
10 s1.erase(3);//删除的是值为3的元素
11 
12 s1.erase(s1.begin(),s1.end());//清空
13 
14 s1.clear();//清空

  (4)查找和统计

 1 set<int> s1;
 2 s1.insert(3);
 3 s1.insert(5);
 4 s1.insert(6);
 5 s1.insert(1);
 6 //查找成功返回迭代器的位置,失败返回s1.end();
 7 set<int >iterator :: pos=s1.find(6);
 8 
 9 if(pos!=s1.end())
10 {
11     cout<<"找到元素:"<<*pos<<endl;
12 }else
13     cout<<"没找到"<<endl;
14 //统计元素个数
15 int num = s1.count(3);

  (5)对组的概念

  由于set容器每插入一个元素就会返回一个对组,对组是成对出现的一组数据,有两种创建方式

1 //方法1
2 pair<string,int> p("LiMing",25);
3 cout<<"姓名:"<<p.first<<"年龄:"<<p.second<<endl;
4 //方法2
5 pair<string,int> p=make_pair("LiMing",25);

  (6) 改变set容器的排序规则

    改变内置数据类型的比较规则:

 1 //仿函数
 2 class MyCompare{
 3 public:
 4     bool operator()(int v1,int v2){
 5         return v1 > v2;
 6     }
 7 };
 8 //在插入之前改变规则
 9 set<int, MyCompare>s2;
10 s2.insert(10);
11 s2.insert(2);
12 s2.insert(5);
13 for (set<int, MyCompare>::iterator it = s2.begin(); it != s2.end(); it++){
14     cout << *it1 << " ";
15 }
16 //10 5 2

    改变自定义数据的排序规则

 1 class Person{
 2 public:
 3     Person(string name,int age){
 4         m_Name = name;
 5         m_Age = age;
 6     }
 7     string m_Name;
 8     int m_Age;
 9 };
10 class comparePerson{
11 public:
12     bool operator()(const Person &p1,const Person &p2){
13         return p1.m_Age > p2.m_Age;
14     }
15 };
16 Person p1("妲己", 23);
17 Person p2("张飞", 29);
18 Person p3("赵云", 34);
19 Person p4("刘备", 28);
20 //按年龄从大到小
21 set<Person, comparePerson>s1;
22 s1.insert(p1);
23 s1.insert(p2);
24 s1.insert(p3);
25 s1.insert(p4);
26 for (set<Person, comparePerson>::iterator it = s1.begin(); it != s1.end(); it++){
27         cout << "姓名 :" << it->m_Name << " 年龄: " << it->m_Age << endl;
28     }
29 //姓名 :赵云 年龄: 34
30 //姓名 :张飞 年龄: 29
31 //姓名 :刘备 年龄: 28
32 //姓名 :妲己 年龄: 23