【STL容器讲解—deque】
STL中deque容器讲解
- deque容器的实现
- 相对于vector容器的区别
- 原因:
- deque内部工作原理
- 构造函数
- 容器操作
- 插入操作
- deque容器的遍历操作
- 大小操作
- 插入和删除
- 数据存取
- 容器元素排序
deque容器的实现
deque容器是STL中的一个重要的容器,它的实现的功能是一个双端数组,可以对两端数据进行插入和删除操作。
相对于vector容器的区别
deque容器相对于vector容器有着如下几个特点:
1.deque容器对头部的插入和删除操作比vector容器快;
2. 在访问元素时deque容器速度比vector容器速度慢;
原因:
vector容器是一个动态分配的连续内存空间,因此在对头部数据及逆行插入和删除时会造成大量数据的移动,但是在对数据进行访问时vector容器的又能做到快速的访问到容器中的指定元素。
deque容器的访问可如下图所示:
deque内部工作原理
deque内部有一个中控器,维护每段缓冲区的内容,缓冲区中存放真实数据。这使得deque容器并不是像vector容器那样是整个连续的内存空间,而是由多的内存空间片段组成,中控器记录下每个内存片段的首地址,使得deque对外就像是一段连续的存储空间。
这使其在头部插入删除元素很快,但是访问数据时速度不如vector
deque容器也支持随机存取功能
构造函数
deque容器有四种构造函数的形式,分别为
1.dequedeqT;
deque<int> deqT;
2.deque(begin, end);
deque<int>dequeT2(dequeT.begin(), dequeT.end());//将dequeT中从begin到end区间的元素复制到本容器中
3.deque(int n, elem);
deque<int>dequeT3(3,5);//向容器中插入3个5
4.deque(deque& dequeT);//拷贝构造函数
deque<int>dequeT4(dequeT3);//将dequeT3容器中的元素拷贝到dequeT4中
deque容器在使用是头文件需包含进来
#include<deque>
容器操作
插入操作
- deque& operator=(deque& deqT);//重载operator=运算符
deque<int>deqT1;
T1.push_back(1);
deque<int>deqT2;
deqT2 = deqT1;
- assign(begin,end)
deque<int>deqT3;
deqT3.assign(deqT1.begin(), deqT1.end());//将deqT2容器begin到end区间的元素拷贝到deqT3容器中
- assign(int n, elem);
deque<int>deqT4;
deqT4.assign(3,6);//deqT4容器中的元素为6,6,6
deque容器的遍历操作
deque容器的遍历操作有三种方法vector容器的遍历操作与deque相同
- while循环
//while循环的相关代码为
void printDeque(deque<T>& deqT)//T为数据类型,如果是内置数据类型则可以直接输出,如果是自定义数据类型则需注意需要重写cout<<左移运算符
{deque<T>::iterator begin = deqT.begin();deque<T>::iterator end = deqT.end();while(begin != end){cout<< *begin << endl;begin++;}
}
- for循环
void dequePrint(deque<T>& v)
{for (deque<T>::iterator it = v.begin(); it != v.end(); it++){cout << *it << " ";}cout << endl;
}
//在上述函数中,如果要在函数体内无法修改容器元素的值,可改写为如下代码
void showVector(const deque<T>& v)//加入const关键字
{for (deque<T>::const_iterator it = v.begin(); it != v.end(); it++)//迭代器更改为const_iterator{//*it = 100; //此时就会报错,表达式是不可修改的左值cout << *it << " ";}cout << endl;
}
- algorithm的for_each算法
//首先在使用algorithm算法时需要先将头文件包含进来
#include<algorithm>
//先要写一个自定义函数 ,这个自定义函数是后面供for_each使用的
void func(int val)
{cout<< val << endl;
}
//接着使用for_each方法
/*
这个函数的意思是从deqT.begin()到deqT.end()区间的元素每个元素都执行func(*begin())方法
*begin是将begin迭代器所指向的元素解析出来(具体关于for_each算法的定义可在VS环境下转到定义中查看)
*/
for_each(deqT.begin(),deqT.end(),func);
大小操作
empty(); //判空操
size()获取元素个数
resize(int n);//重新给元素指定个数n,不足的则用默认值补上,超过的则截取超出空间的元素
resize(int n, elem);//重新给元素指定个数n,不足的则用elem补上,超过的则截取超出空间的元素
deque<int> deqT;for (int i = 0; i < 10; i++){deqT.push_back(i + 1); }if (deqT.empty())//若容器为空,则返回true{cout << "这是空的" << endl;}else{cout << deqT.size() << endl;//返回 deque容器的大小deqT.resize(5); //输为1 2 3 4 5deqT.resize(10, 6);//输出为1 2 3 4 5 6 6 6 6 6}
vector容器的操作与deque几乎相同,但是在deque容器中没有容量这一概念,在vector容器中用capacity()函数获取
插入和删除
- deque容器两端插入数据
push_front();//首部插入数据
deque<int> deq;
deq.push_front(1);//deq容器中元素为:1
push_back();//尾部插入数
deq.push_back(2);//deq容器中元素为:1 2
- deque容器中间插入数据
insert(pos, elem);//向pos位置插入elem元素,现在和下面方法中所提到的pos都是迭代器位置
deq.insert(deq.begin(), 5);//deq容器中元素为:5 1 2
insert(pos, n, elem);//向pos位置插入n个elem元素
deq.insert(deq.end(), 4, 5);//deq容器中元素为: 5 1 2 5 5 5 5
insert(pos,begin,end);;//向pos位置插入[begin,end)区间元素
deque<int>deq1;
deq1.push_back(1);
deq1.push_back(2);
deq1.push_back(3);
deq.insert(deq.begin(), deq1.begin(), deq1.end());//deq容器中元素为: 5 1 2 5 5 5 5 1 2 3
- deque容器两端删除数据
pop_front();//删除首部数据
deq.pop_front();//deq容器中元素为:1 2 5 5 5 5 1 2 3
pop_back();//删除尾部数据
deq.pop_back();//deq容器中元素为:1 2 5 5 5 5 1 2
- deque容器删除数据
erase(pos);//删除pos位置的元素,返回下个数据的位置,pos用迭代器表示位置
deque<int>::iterator a = deq.erase(deq.begin());//deq容器中元素为2 5 5 5 5 1 2
cout << "a为:" << *a << endl;//a为2
erase(begin,end);//删除[begin,end)区间的元素,返回下个数据的位置
deque<int>::iterator b = deq.erase(++deq.begin(), --deq.end());//deq容器中元素为2 2cout << "b为:" << *b << endl;//b为2,这里的2是后面的元素
数据存取
deque<int>deq;
for (int i = 0; i < 10; i++)
{deq.push_back(i + 1);
}
- at(pos);访问pos位置的元素,这里的pos是容器的下标,int型数据
deq.at(0);//1
- operator[];
deq[1];//2
-front();
deq.front();//1
- back();
deq.back();//10
容器元素排序
sort(iterator begin, iterator end);//对[begin,end)区间的元素进行排序,begin和end表示的是迭代器
sort()方法是STL提供的排序方法,默认是升序排序,所有支持随机访问的容器都能使用sort()方法。
#include<algorithm>//使用sort()函数必须包含标准算法头文件
deque<int> deq
deq.push_back(2);
deq.push_back(5);
deq.push_back(8);
deq.push_front(3);
deq.push_front(6);
deq.push_front(1);
dequePrint(deq);//1 6 3 2 5 8
sort(deq.begin(),deq.end());
dequePrint(deq);//1 2 3 5 6 8
}
【STL容器讲解—deque】相关推荐
- c++STL容器的Deque
STL容器的Deque Deque简介 deque对象的默认构造 deque末尾的添加移除操作 deque的数据存取 deque与迭代器 deque对象的带参数构造 deque的赋值 deque的大小 ...
- C++ 笔记(19)— 标准模板库(STL容器、STL迭代器、STL算法、STL容器特点、STL字符串类)
C++ 标准库可以分为两部分: 标准函数库: 这个库是由通用的.独立的.不属于任何类的函数组成的.函数库继承自 C 语言. 面向对象类库: 这个库是类及其相关函数的集合. C++ 标准库包含了所有的 ...
- c++ STL容器初探
什么是容器 首先,我们必须理解一下什么是容器,在C++ 中容器被定义为:在数据存储上,有一种对象类型,它可以持有其它对象或指向其它对像的指针,这种对象类型就叫做容器.很简单,容器就是保存其它对象的对象 ...
- C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(Windows VirtualStudio)——遍历和删除
相关环境和说明在<C++拾趣--STL容器的插入.删除.遍历和查找操作性能对比(Windows VirtualStudio)--插入>已给出.本文将分析各个容器中遍历和查找的性能.(转载请 ...
- C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(Windows VirtualStudio)——删除
相关环境和说明在<C++拾趣--STL容器的插入.删除.遍历和查找操作性能对比(Windows VirtualStudio)--插入>已给出.本文将分析从头部.中间和尾部对各个容器进行删除 ...
- C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(ubuntu g++)——遍历和查找
相关环境和说明在<C++拾趣--STL容器的插入.删除.遍历和查找操作性能对比(ubuntu g++)--插入>已给出.本文将分析各个容器中遍历和查找的性能.(转载请指明出于breakso ...
- C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(ubuntu g++)——删除
相关环境和说明在<C++拾趣--STL容器的插入.删除.遍历和查找操作性能对比(ubuntu g++)--插入>已给出.本文将分析从头部.中间和尾部对各个容器进行删除的性能.(转载请指明出 ...
- gdb 查看 stl容器 zz
将下面文件作为 ~/.gdbinit的内容, 或者在已有的~/.gdbinit中source下面的文件, 然后可以以下列方式查看stl容器的数据: 容器类型 GDB 命令 std::vector&l ...
- 标准非STL容器 : bitset
1. 概念 什么是"标准非STL容器"?标准非STL容器是指"可以认为它们是容器,但是他们并不满足STL容器的所有要求".前文提到的容器适配器stack.que ...
最新文章
- python 列出出当前目录及所有子目录下的文件
- Android关于SQLiteOpenHelper的封装
- python的底层实现,Python封装底层实现原理详解(通俗易懂)
- 建模算法(六)——神经网络模型
- 开源许可协议了解这些就够了
- elk服务重启_ELK开机启动 service文件内容
- 域名指向 旧域名跳转到新域名
- 商汤科技2020笔试题
- Pollard’s rho 算法解大数质因子问题
- 日记 [2007年04月19日]竹叶扫街尘不动,鏡花潭底水无痕
- 基于iLog3的实时日志实现
- 设置全局css/less/sass样式and优化与style-resources-loader的理解
- linux apache 404配置文件,apache httpd服务器404错误跳转配置教程
- dreamweaver排列顺序怎么用_Dreamweaver使用技巧
- 苹果手机(ipone)点击元素,事件不执行
- “新华三杯”全国大学生数字技术大赛预选赛备考资料
- 计算机事件查看u盘使用情况,关于U盘使用记录的日志文件
- Xcode 更改默认版本 xcode-select
- 【Google I/O 2017回顾】Mobile First To AI First
- 学习java的基础总结
热门文章
- 渗透过程中日志信息分析示例
- PHP程序设计读书笔记七
- linux deploy连接ssh失败,ubuntu – Jenkins发布ssh成功连接服务器但是put文件失败
- 我喜欢出发 - 汪国真
- 微信小程序开发-微信支付功能【WxMaService 获取openid,WxPayService建微信订单,接收微信支付异步通知回调方法,附有完整前后端代码】
- 制作一幅好地图的10个技巧
- 普通地图的六大要素_地图的构成要素和基本特性
- 各个音阶的频率_各个音的频率是如何确定的?
- BI神器Power Query(17)-- PQ制作时间维度表(6)
- linux中strlen的用法,实现strlen()函数,strcmp()函数 const知识点