![23275a56eb7d0fd2af730589649775fb.png](https://i-blog.csdnimg.cn/blog_migrate/38daee8098a66bc66879add6e4b88628.jpeg)
序列容器
序列容器(sequence)只提供插入功能,其中的元素都是有序的,但并未排序。
序列容器包括:
- vector向量
- deque双端队列
- list链表
向量类模板
向量(vector)是一种随机访问的数组类型,提供了对数组元素的快速、随机访问,以及在序列尾部快速、随机的插入和删除操作。 他是大小可变的向量,在需要时可以改变其大小。
创建向量模板(vector)对象的方法
1. std::vectorname; //为 type创建一个空的name容器
2.std::vectorname(size);// 初始化具有size个元素的vector对象
3.std::vectorname(size,value); //初始化具有size个元素的vector对象,并预设值。
4.std::vectorname(myvector);//使用复制构造函数,用现有的向量myvector创建vector对象。
5.std::vectorname(first,last);//创建元素范围内的向量,[first,last]范围。
vector对象的成员函数
函数1:assign(first,last) ;用迭代器[first,last]范围内元素替换向量元素。
函数2:at(n) ; 返回想两种第n个位置元素的值。
函数3:back;返回对向量末尾元素的引用。
函数4:begin ; 返回指向向量中第一个元素的迭代器。
函数5:capcity ; 返回当前向量最多可以容纳的元素个数。
函数6:clear ; 删除向量中所有元素。
函数7:empty ; 如果向量为空,则返回true值。
函数8:end ; 返回指向向量中最后一个元素的迭代器。
函数9:erase(start,end) ; 删除迭代器[start,end]内的向量元素。
函数10;insert(i,x) ; 把值x插入向量中由迭代器i所指明的位置。
函数11:resize(n,x) ; 重设向量大小n,初始值为x;
函数12:swap(vector) ;交换两个向量的内容。
向量容器的用途
1.对数组元素的快速、随机访问。
2.在序列某位置或区域快速、随机插入元素。
3.删除序列某位置或区域的元素。
向量类模板应用实例
#include "stdafx.h"#include #include #include using namespace std;void Output(char val){cout << val << ' ';}int main(){vector CV; //创建字符向量CV.push_back('J');CV.push_back('Y');CV.push_back('F');cout << "Contents of vector:";for_each(CV.begin(), CV.end(), Output); //循环显示限量中元素sort(CV.begin(),CV.end());cout << std::endl << "排序--Contents of vector:";for_each(CV.begin(), CV.end(), Output); //循环显示限量中元素 --遍历cout << endl;cout << CV.empty() << endl; //判断返回1CV.clear(); //清空cout << CV.empty() << endl; //返回0cout << CV.capacity()<< endl; //返回3system("pause"); return 0;}
结果为:
![a8621b25b72407c7ccb84370717551fd.png](https://i-blog.csdnimg.cn/blog_migrate/2ff75f2ca18f94025f160ea757954d35.jpeg)
双端队列类模板
双端队列(deque) 是一种随机访问的数据类型,提供了在序列两端快速插入和删除操作的功能,他可以在需要时修改其自身的大小,主要完成标准C++数据结构中队列的功能。
创建deque对象的方法
1. std::dequename; //为 type创建一个空的name的deque对象。
2.std::dequename(size);// 初始化具有size个元素的deque对象。
3.std::dequename(size,value); //初始化具有size个元素的deque对象,并预设值。
4.std::dequename(myvector);//使用复制构造函数,用现有的向量myvector创建vector对象。
5.std::dequename(first,last);//创建元素范围内的向量,[first,last]范围。
deque对象主要成员函数
函数1:assign(first,last) ;用迭代器[first,last]范围内元素替换向量元素。
函数2:at(n) ; 返回想两种第n个位置元素的值。
函数3:begin ; 返回指向向量中第一个元素的迭代器。
函数4:clear ; 删除向量中所有元素。
函数5:empty ; 如果向量为空,则返回true值。
函数6:erase(start,end) ; 删除迭代器[start,end]内的向量元素。
函数7:insert(i,x) ; 把值x插入向量中由迭代器i所指明的位置。
函数8:size() ; 返回双端队列的大小(元素的个数)。
deque双端队列类模板的特点
- deque是双向开口的连续性空间(动态的将多个连续空间用指针数组将其连接在一起成为队列)。
- deque两端做插入和删除操作时间为常数时间,中间插入则比较麻烦且性能不及list。
- 是一种顺序容器,支持随机访问,即支持[]以及at(),但是性能没有vector好。
deque的内存管理模型
其内存管理包括三个部分: 序列容器、map数组指针、iterator迭代器。
序列容器:存储数据元素片段;[连续空间1、连续空间2,...]
map数组指针:管理元素片段;[node1,node2,node3,...]
iterator迭代器:对应每一片段的元素地址[cur、first、last、node]
![daf3a1d2911afabdd586cb4aeda99aaa.png](https://i-blog.csdnimg.cn/blog_migrate/77c35859c706ee1748e407152b4404c8.jpeg)
deque双端队列类模板的应用
//deque双端队列类模板 example //#include #include using namespace std;nt main(){deque ID; //创建整数队列ID.push_back(5); //添加整数ID.push_back(2);ID.push_back(9);ID.push_back(9);cout << "deque:old" << endl;for (int i = 0; i < ID.size(); i++) //遍历{cout << "ID[" << i << "]";cout << ID[i] << endl;}cout << endl;ID.pop_front();ID.pop_front();ID[1] = 77;cout << "Deque:new" << endl;for (int i=0;i
结果为:
![560b9a88c1bc7e642c53b379907b04f7.png](https://i-blog.csdnimg.cn/blog_migrate/ab30e938cbeb74471d8839a31471491c.jpeg)
注: deque对象无capacity属性。
链表类模板(list)
链表(list),即双向链表容器,他不支持随机访问,访问链表元素要指针才能关联表的某一个端点开始,插入和删除操作所花费的时间是固定的,和该元素在链表中的位置无关。list在任何位置插入和删除动作都很快,不像vector只能在末尾进行操作。
链表类模板创建list对象方法
1. std::listname; //为 type创建一个空的name的list对象。
2.std::listname(size);// 初始化具有size个元素的list对象。
3.std::listname(size,value); //初始化具有size个元素的list对象,并预设值。
4.std::listname(myvector);//使用复制构造函数,用现有的向量myvector创建vector对象。
5.std::listname(first,last);//创建元素范围内的向量,[first,last]范围。
list对象主要成员函数
函数1:assign(first,last) ;用迭代器[first,last]范围内元素替换向量元素。
函数2:at(n) ; 返回想两种第n个位置元素的值。
函数3:begin ; 返回指向向量中第一个元素的迭代器。
函数4:size(); 返回链表的大小(元素个数)。
函数5:clear ; 删除向量中所有元素。
函数6:empty ; 如果向量为空,则返回true值。
函数7:erase(start,end) ; 删除迭代器[start,end]内的向量元素。
函数8:insert(i,x) ; 把值x插入向量中由迭代器i所指明的位置。
list类模板实例
//list类模板实例#include #include using namespace std;int main(){char CTemp;listCL;for (int i = 0; i < 5; i++){CTemp = 'a' + i;CL.push_front(CTemp); //添加元素}cout << "list old:" << endl;list::iterator it; //定义迭代器对象for (it = CL.begin(); it != CL.end(); it++) //遍历list链表{cout << *it << endl;}list::iterator itstart = CL.begin(); //定义开始位置指针CL.insert(++itstart,2,'A'); //在其后插入两个Acout << "list old" << endl;for (it = CL.begin(); it != CL.end(); it++) //遍历链表{cout << *it << endl;}cout << CL.empty() << endl; //判断是否为空CL.clear(); cout << CL.empty() << endl;system("pause");return 0;}
结果为:
![bbd5b8fbd0b686c904f8f40611b81569.png](https://i-blog.csdnimg.cn/blog_migrate/4f16eabf0614df0db5a8a948d75309bd.jpeg)
数组、vector、deque和list的区别和联系
参考https://blog.csdn.net/bruceyang2009lzu/article/details/8525451
相同点:
1.都是顺行性容器;
2.vector、deque和list大小不固定,支持动态增长;
3.vector和deque中间插入元素效率都很低,但是deque优于vector;
不同点:
1.插入及效率位置不同
![840059c7b0aad269cb1460e960df1f11.png](https://i-blog.csdnimg.cn/blog_migrate/1dce90198908e4e464a57b535f7a7372.jpeg)
2.容器对象函数效率不同
![9f15812e321e595095aeeabab519b169.png](https://i-blog.csdnimg.cn/blog_migrate/512eb262df9d9e3522eca5b4caf48e9a.jpeg)
3.随机存取方式不同
数组:不支持随机存取
vector: 根据位置信息,建立线性函数关系,直接确定查找位置。
deque:根据位置信息,建立分段函数关系,确定查找位置。
list:根据位置信息,遍历查找位置,不支持随机存取。
4.应用场景不同
vector: 操作末端数据时常用,
deque:操作前后端数据时常用,
list:操作中间数据时常用。
5.内部存储及执行机制
![1c3d59d26268954cc9fa75a64c480210.png](https://i-blog.csdnimg.cn/blog_migrate/734c4079478ddd5e43d867c3c044435d.jpeg)
本文部分内容参考至网络,如有错误,敬请指正,如有侵权,请联系修改,欢迎加入模糊区讨论,谢谢。