递增的整数序列链表的插入_你所不知道的序列容器

23275a56eb7d0fd2af730589649775fb.png

序列容器

序列容器(sequence)只提供插入功能,其中的元素都是有序的,但并未排序。

序列容器包括:

  1. vector向量
  2. deque双端队列
  3. 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

双端队列类模板

双端队列(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双端队列类模板的特点

  1. deque是双向开口的连续性空间(动态的将多个连续空间用指针数组将其连接在一起成为队列)。
  2. deque两端做插入和删除操作时间为常数时间,中间插入则比较麻烦且性能不及list。
  3. 是一种顺序容器,支持随机访问,即支持[]以及at(),但是性能没有vector好。

deque的内存管理模型

其内存管理包括三个部分: 序列容器、map数组指针、iterator迭代器。

序列容器:存储数据元素片段;[连续空间1、连续空间2,...]

map数组指针:管理元素片段;[node1,node2,node3,...]

iterator迭代器:对应每一片段的元素地址[cur、first、last、node]

daf3a1d2911afabdd586cb4aeda99aaa.png

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

注: 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

数组、vector、deque和list的区别和联系

参考https://blog.csdn.net/bruceyang2009lzu/article/details/8525451

相同点:

1.都是顺行性容器;

2.vector、deque和list大小不固定,支持动态增长;

3.vector和deque中间插入元素效率都很低,但是deque优于vector;

不同点:

1.插入及效率位置不同

840059c7b0aad269cb1460e960df1f11.png

2.容器对象函数效率不同

9f15812e321e595095aeeabab519b169.png

3.随机存取方式不同

数组:不支持随机存取

vector: 根据位置信息,建立线性函数关系,直接确定查找位置。

deque:根据位置信息,建立分段函数关系,确定查找位置。

list:根据位置信息,遍历查找位置,不支持随机存取。

4.应用场景不同

vector: 操作末端数据时常用,

deque:操作前后端数据时常用,

list:操作中间数据时常用。

5.内部存储及执行机制

1c3d59d26268954cc9fa75a64c480210.png

本文部分内容参考至网络,如有错误,敬请指正,如有侵权,请联系修改,欢迎加入模糊区讨论,谢谢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值