例说数据结构&STL(三)——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

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值