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