例说数据结构&STL(三)——deque
1 白话双向队列(deque) deque双向队列是一种双向开口的连续线性空间,可以高效的在头尾两端插入和删除元素,deque在STL中接口上和vector非常相似,此外它还是STL中queue和stack的底层依赖组件。 如上图所示,deque拥有一个bitmap结构(称之为map,并不是STL中容器map),map中每一个元素指向一块连续的内存块,后者才是真正存储deque元素的
1 白话双向队列(deque)
deque双向队列是一种双向开口的连续线性空间,可以高效的在头尾两端插入和删除元素,deque在STL中接口上和vector非常相似,此外它还是STL中queue和stack的底层依赖组件。
如上图所示,deque拥有一个bitmap结构(称之为map,并不是STL中容器map),map中每一个元素指向一块连续的内存块,后者才是真正存储deque元素的地方,因为每个块都是固定大小的,但是每个块之间不要求是连续的,所以扩充空间的时候,就没有vector那样的副作用了,即无需“配置新空间 / 移动旧数据 / 释放旧空间”的一套过程。
2 STL中deque实战
2.1 头文件包含
STL容器deque包含的头文件如下形式:
#include<deque>
其次一定要加上C++标准库命名空间std,可以在包含头文件下面加上命名空间using namespace std;
。
2.2 类型定义
和前面介绍的vector类似,这里不太过多描述,直接看下面的程序。这块实例我们使用C++中string类作为deque模板类型,当然这样在开头就需要包含对应的头文件。
#include<deque>
#include<string> //注意与string.h的区别
using namespace std;
deque<string> deq_fir;
deque<string> deq_sed(10,"hello world!"); //初始化10个"hello world!"
deque<string> deq_thd(deq_sed.begin(),deq_sed.end()); //赋值deq_sed初始化deq_thd
2.3 赋值操作
deq_fir.assign(10,"Boy");
deq_fir.assign(deq_thd.begin(),deq_thd.begin()+2); //赋值deq_thd前两个字符串给deq_fir。
2.4 查询元素
cout<<deq_fir.at(2)<<endl; //查询下标为2的元素
cout<<deq_fir[2]<<endl; //同样是查询下标为2的元素,即第三个元素
cout<<deq_fir.front()<<endl; //查询第一个元素
cout<<deq_fir.back()<<endl; //查询最后一个元素
2.5 删除操作
deq_fir.erase(deq_fir.begin()+5); //删除第五个元素
deq_fir.erase(deq_fir.begin(),deq_fir.begin()+3); //删除前三个元素
2.6 插入操作
deq_fir.insert(deq_fir.begin(),10,"banana!"); //首部插入10个"banana!"字符串
deq_Fir.insert(deq_fir.end(),"apple!"); //尾部插入一个“apple!”字符串
2.7 首尾删除和添加操作
deq_fir.push_back("hello"); //尾部添加字符串
deq_fir.push_front("world!");//首部添加字符串
deq_fir.pop_back(); //尾部删除一个元素
deq_fir.pop_front(); //首部删除一个元素
2.8 其他操作
if(!deq_fir.empty()) // 判断是否为空deque
{
deq_fir.clear(); // 清空操作
}
if(deq_fir.size() > 10) // 查询空间元素个数
deq_fir.resize(10); // 重新定义deque空间大小到10
deq_fir.swap(deq_sed); // 交换两个deque中所有数据
3 小结
本篇博文我们主要介绍了数据结构中双向队列deque以及其在STL中定义的接口,相信大家有了一定的认识。deque内部是小片的连续空间,小片间用链表相连,实际上内部有一个map的指针,因为知道类型,所以还是可以使用[],只是速度没有vector快。快速的访问随机的元素,快速的在开始和末尾插入元素,随机的插入,删除元素要慢,空间的重新分配要比vector快,重新分配空间后,原有的元素不需要拷贝。对deque的排序操作,可将deque先复制到vector,排序后在复制回deque。。
以上是个人学习记录,由于能力和时间有限,如果有错误望读者纠正,谢谢!
转载请注明出处:http://blog.csdn.net/FX677588/article/details/76222608
更多推荐
所有评论(0)