STL学习系列三:Deque容器
1.Deque简介
- deque是“double-ended queue”的缩写,和vector一样都是STL的容器,deque是双端数组,而vector是单端的。
- deque在接口上和vector非常相似,在许多操作的地方可以直接替换。
- deque可以随机存取元素(支持索引值直接存取, 用[]操作符或at()方法,这个等下会详讲)。
- deque头部和尾部添加或移除元素都非常快速。但是在中部安插元素或移除元素比较费时。
2.deque对象的默认构造
deque采用模板类实现,deque对象的默认构造形式:deque<T> deq;
deque <int> deqInt; //一个存放int的deque容器。
deque <float> deq Float; //一个存放float的deque容器。
3.deque对象的带参数构造
- deque(beg,end); //构造函数将[beg, end)区间中的元素拷贝给本身。注意该区间是左闭右开的区间。
- deque(n,elem); //构造函数将n个elem拷贝给本身。
- deque(const deque &deq); //拷贝构造函数。
- #include<iostream>
- using namespace std;
- #include <deque>
- void objPlay3()
- {
- deque<int> deqIntA;
- deqIntA.push_back();
- deqIntA.push_back();
- deqIntA.push_back();
- deqIntA.push_back();
- deqIntA.push_back();
- deque<int> deqIntB(deqIntA.begin(), deqIntA.end()); //1 3 5 7 9
- deque<int> deqIntC(, ); //8 8 8 8 8
- deque<int> deqIntD(deqIntA); //1 3 5 7 9
- }
- int main()
- {
- objPlay3();
- return ;
- }
4.deque的赋值
- deque.assign(beg,end); //将[beg, end)区间中的数据拷贝赋值给本身。注意该区间是左闭右开的区间。
- deque.assign(n,elem); //将n个elem拷贝赋值给本身。
- deque& operator=(const deque &deq); //重载等号操作符
- deque.swap(deq); // 将vec与本身的元素互换
- void objPlay4()
- {
- deque<int> deqIntA, deqIntB, deqIntC, deqIntD;
- deqIntA.push_back();
- deqIntA.push_back();
- deqIntA.push_back();
- deqIntA.push_back();
- deqIntA.push_back();
- deqIntB.assign(deqIntA.begin(), deqIntA.end()); // 1 3 5 7 9
- deqIntC.assign(, ); //8 8 8 8 8
- deqIntD = deqIntA; //1 3 5 7 9
- deqIntC.swap(deqIntD); //C 和 D互换
- }
5.deque的大小
- deque.size(); //返回容器中元素的个数。
- deque.empty(); //判断容器是否为空。
- deque.resize(num); //重新指定容器的长度为num,若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
- deque.resize(num, elem); //重新指定容器的长度为num,若容器变长,则以elem值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
void objPlay5()
{
deque<int> deqIntA;
deqIntA.push_back(1);
deqIntA.push_back(3);
deqIntA.push_back(5);
int iSize = deqIntA.size(); //3
if (!deqIntA.empty())
{
deqIntA.resize(5); //1 3 5 0 0
deqIntA.resize(7, 1); //1 3 5 0 0 1 1
deqIntA.resize(2); //1 3
}
}
6.deque末尾的添加移除操作
- deque.push_back(elem); //在容器尾部添加一个数据
- deque.push_front(elem); //在容器头部插入一个数据
- deque.pop_back(); //删除容器最后一个数据
- deque.pop_front(); //删除容器第一个数据
- void objPlay6()
- {
- deque<int> deqInt;
- deqInt.push_back();
- deqInt.push_back();
- deqInt.push_back();
- deqInt.push_back();
- deqInt.push_back();//此时1,3,5,7,9
- deqInt.pop_front(); //弹出头部第一个元素
- deqInt.pop_front();
- deqInt.push_front();//头部添加元素
- deqInt.push_front();
- deqInt.pop_back(); //弹出最后一个 元素
- deqInt.pop_back();
- }
- void objPlay6()
7.deque的数据存取
- deque.at(idx); //返回索引idx所指的数据,如果idx越界,抛出out_of_range。
- deque[idx]; //返回索引idx所指的数据,如果idx越界,不抛出异常,直接出错。
- deque.front(); //返回第一个数据。
- deque.back(); //返回最后一个数据
- void objPlay7()
- {
- deque<int> deqInt;
- deqInt.push_back();
- deqInt.push_back();
- deqInt.push_back();
- deqInt.push_back();
- deqInt.push_back();
- int iA = deqInt.at(); //
- int iB = deqInt[]; //
- deqInt.at() = ; //
- deqInt[] = ; //
- int iFront = deqInt.front();//
- int iBack = deqInt.back(); //
- deqInt.front() = ; //
- deqInt.back() = ; //
- }
- void objPlay7()
8.deque的插入
- deque.insert(pos,elem); //在pos位置插入一个elem元素的拷贝,返回新数据的位置。
- deque.insert(pos,n,elem); //在pos位置插入n个elem数据,无返回值。
- deque.insert(pos,beg,end); //在pos位置插入[beg,end)区间的数据,无返回值。
- void objPlay8()
- {
- deque<int> deqA;
- deque<int> deqB;
- deqA.push_back();
- deqA.push_back();
- deqA.push_back();
- deqA.push_back();
- deqA.push_back();
- deqB.push_back();
- deqB.push_back();
- deqB.push_back();
- deqB.push_back();
- deqA.insert(deqA.begin(), ); //{11, 1, 3, 5, 7, 9}
- deqA.insert(deqA.begin() + , , ); //{11,33,33,1,3,5,7,9}
- deqA.insert(deqA.begin(), deqB.begin(), deqB.end()); //{2,4,6,8,11,33,33,1,3,5,7,9}
- }
- void objPlay8()
9.deque的删除
- deque.clear(); //移除容器的所有数据
- deque.erase(beg,end); //删除[beg,end)区间的数据,返回下一个数据的位置。
- deque.erase(pos); //删除pos位置的数据,返回下一个数据的位置。
- void objPlay9()
- {
- int intarr[] = { , , , , , , , , , };
- //假设 deqInt 包含1, 3, 2, 3, 3, 3, 4, 3, 5, 3,删除容器中等于3的元素
- deque<int> deqInt(intarr, intarr + );
- for (deque<int>::iterator it = deqInt.begin(); it != deqInt.end();) //小括号里不需写 ++it
- {
- if (*it == )
- {
- it = deqInt.erase(it); //以迭代器为参数,删除元素3,并把数据删除后的下一个元素位置返回给迭代器。
- //此时,不执行 ++it;
- }
- else
- {
- ++it;
- }
- }
- //删除deqInt的所有元素
- deqInt.clear(); //容器为空
- }
整理所有代码如下:
- void objPlay9()
- #include<iostream>
- using namespace std;
- #include <deque>
- void objPlay3()
- {
- deque<int> deqIntA;
- deqIntA.push_back();
- deqIntA.push_back();
- deqIntA.push_back();
- deqIntA.push_back();
- deqIntA.push_back();
- deque<int> deqIntB(deqIntA.begin(), deqIntA.end()); //1 3 5 7 9
- deque<int> deqIntC(, ); //8 8 8 8 8
- deque<int> deqIntD(deqIntA); //1 3 5 7 9
- }
- void objPlay4()
- {
- deque<int> deqIntA, deqIntB, deqIntC, deqIntD;
- deqIntA.push_back();
- deqIntA.push_back();
- deqIntA.push_back();
- deqIntA.push_back();
- deqIntA.push_back();
- deqIntB.assign(deqIntA.begin(), deqIntA.end()); // 1 3 5 7 9
- deqIntC.assign(, ); //8 8 8 8 8
- deqIntD = deqIntA; //1 3 5 7 9
- deqIntC.swap(deqIntD); //C 和 D互换
- }
- void objPlay5()
- {
- deque<int> deqIntA;
- deqIntA.push_back();
- deqIntA.push_back();
- deqIntA.push_back();
- int iSize = deqIntA.size(); //
- if (!deqIntA.empty())
- {
- deqIntA.resize(); //1 3 5 0 0
- deqIntA.resize(, ); //1 3 5 0 0 1 1
- deqIntA.resize(); //1 3
- }
- }
- void objPlay6()
- {
- deque<int> deqInt;
- deqInt.push_back();
- deqInt.push_back();
- deqInt.push_back();
- deqInt.push_back();
- deqInt.push_back();//此时1,3,5,7,9
- deqInt.pop_front(); //弹出头部第一个元素
- deqInt.pop_front();
- deqInt.push_front();//头部添加元素
- deqInt.push_front();
- deqInt.pop_back(); //弹出最后一个 元素
- deqInt.pop_back();
- }
- void objPlay7()
- {
- deque<int> deqInt;
- deqInt.push_back();
- deqInt.push_back();
- deqInt.push_back();
- deqInt.push_back();
- deqInt.push_back();
- int iA = deqInt.at(); //
- int iB = deqInt[]; //
- deqInt.at() = ; //
- deqInt[] = ; //
- int iFront = deqInt.front();//
- int iBack = deqInt.back(); //
- deqInt.front() = ; //
- deqInt.back() = ; //
- }
- void objPlay8()
- {
- deque<int> deqA;
- deque<int> deqB;
- deqA.push_back();
- deqA.push_back();
- deqA.push_back();
- deqA.push_back();
- deqA.push_back();
- deqB.push_back();
- deqB.push_back();
- deqB.push_back();
- deqB.push_back();
- deqA.insert(deqA.begin(), ); //{11, 1, 3, 5, 7, 9}
- deqA.insert(deqA.begin() + , , ); //{11,33,33,1,3,5,7,9}
- deqA.insert(deqA.begin(), deqB.begin(), deqB.end()); //{2,4,6,8,11,33,33,1,3,5,7,9}
- }
- void objPlay9()
- {
- int intarr[] = { , , , , , , , , , };
- //假设 deqInt 包含1, 3, 2, 3, 3, 3, 4, 3, 5, 3,删除容器中等于3的元素
- deque<int> deqInt(intarr, intarr + );
- for (deque<int>::iterator it = deqInt.begin(); it != deqInt.end();) //小括号里不需写 ++it
- {
- if (*it == )
- {
- it = deqInt.erase(it); //以迭代器为参数,删除元素3,并把数据删除后的下一个元素位置返回给迭代器。
- //此时,不执行 ++it;
- }
- else
- {
- ++it;
- }
- }
- //删除deqInt的所有元素
- deqInt.clear(); //容器为空
- }
- int main()
- {
- objPlay3();
- objPlay4();
- objPlay5();
- objPlay6();
- objPlay7();
- objPlay8();
- objPlay9();
- return ;
- }
- #include<iostream>
STL学习系列三:Deque容器的更多相关文章
- STL学习笔记(三) 关联容器
条款19:理解相等(equality)和等价(equivalence)的区别 相等的概念是基于 operator== 的,如果 operator== 的实现不正确,会导致并不实际相等等价关系是以&qu ...
- 标准模板库(STL)学习探究之vector容器
标准模板库(STL)学习探究之vector容器 C++ Vectors vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被 ...
- MyBatis学习系列三——结合Spring
目录 MyBatis学习系列一之环境搭建 MyBatis学习系列二——增删改查 MyBatis学习系列三——结合Spring MyBatis在项目中应用一般都要结合Spring,这一章主要把MyBat ...
- scrapy爬虫学习系列三:scrapy部署到scrapyhub上
系列文章列表: scrapy爬虫学习系列一:scrapy爬虫环境的准备: http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_python_00 ...
- DocX开源WORD操作组件的学习系列三
DocX学习系列 DocX开源WORD操作组件的学习系列一 : http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_sharp_001_docx1.htm ...
- RabbitMQ学习系列三-C#代码接收处理消息
RabbitMQ学习系列三:.net 环境下 C#代码订阅 RabbitMQ 消息并处理 http://www.80iter.com/blog/1438251320680361 http://www. ...
- .net reactor 学习系列(三)---.net reactor代码自动操作相关保护功能
原文:.net reactor 学习系列(三)---.net reactor代码自动操作相关保护功能 接上篇,上篇已经学习了界面的各种功能以及各种配置,这篇准备学习下代码控制许可证. ...
- STL学习系列四:Stack容器
Stack简介 stack是堆栈容器,是一种“先进后出”的容器. stack是简单地装饰deque容器而成为另外的一种容器. #include <stack> 1.stack对象的默认构造 ...
- STL学习系列五:Queue容器
Queue简介 queue是队列容器,是一种“先进先出”的容器. queue是简单地装饰deque容器而成为另外的一种容器. #include <queue> 1.queue对象的默认构造 ...
随机推荐
- [UVA796]Critical Links(割边, 桥)
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...
- input默认提示取消
input 输入框有提示功能,当你之前输入过一些内容,你下次打入相关字符的时候,默认会有之前输入的一些相关的字符的提示,这个提示一般来说还是很好的,但是,有时候,我们想自己输入,不想要提示. 如果不需 ...
- 基于XMPP的即时通信系统的建立(四)— 组件介绍
服务端 服务器 许可证 操作系统 是否支持任意客户端登录 备注 ejabberd 开源 Elang 是 支持虚拟主机和集群 Openfire Apache Java 是 Tigase GPLv3 Ja ...
- UVa 11400 Lighting System Design【DP】
题意:给出n种灯泡,分别给出它们的电压v,电源费用k,每个灯泡的费用c,和所需灯泡的数量l,问最优方案的费用 看的紫书= = 首先是dp[i]为灯泡1到i的最小费用, dp[i]=min(dp[i], ...
- UVALive 4128 Steam Roller(最短路(拆点,多状态))
题意:模拟了汽车的行驶过程,边上的权值为全速通过所消耗的时间,而起步(从起点出发的边).刹车(到终点结束的边).减速(即将拐弯的边).加速(刚完成拐弯的边)这四种不能达到全速的情况,消耗的时间为权值* ...
- UVA 10972 RevolC FaeLoN(边连通分量)
坑了我一天的题目..跑了20ms挂了,就知道有个小毛病= = 无向图转有向图判强连通. 首先要知道什么样的无向图可以转化为强连通图?连通分量(环)自然是可以的:那么扩大范围(存在割顶),发现点连通分量 ...
- POI读取Word与Excel
import java.io.BufferedWriter; import java.io.FileInputStream; import java.io.FileNotFoundException; ...
- uestc 1720无平方因子数
求素数 然后容斥原理// n之内有平方因子的数的个数sum =n/(2^2) + n/(3^2)+……+n/(k^2) - n/(2^2 * 3^2)-……+……. // #pragma commen ...
- curl命令访问域名
1.前言 curl是利用URL语法在命令行方式下工作的开源文件传输工具(来自百度百科).cURL 是一种简单有效的工具,可以使用cURL工具进行WEB相关的调试开发工具,相对于Yeelink这样的云平 ...
- JQuery实现——黑客帝国代码雨效果
效果如你所见就是本页面上方那样的效果 实现方法来自一个印度小伙纸,学习完我也没总结一下,今儿个补上 如何实现,大家右键查看源码复制即可,不过学习的过程还是要总结总结. 下面通过另外两个小例子,一步一步 ...