Deuqe概念

容器deque和vector非常相似,属于序列式容器。都是采用动态数组来管理元素,提供随机存取,并且有着和vector一样的接口。不同的是deque具有首尾两端进行快速插入、删除的能力。

Deque结构

        如图1是deque的逻辑结构,从表面上看,deque具有连续性的存储空间,并支持随机存取功能。实际上deque并不是我们所看到的样子,其内部结构,如图2所示。
deque在实现上主要有以下两点:
1.由一段一段的定量连续空间构成,第一个区块朝某个方向扩展,最后一个区块朝相反方向扩展;
2.管理这些分段的定量连续空间,维护其整体连续的假象,并提供随机存取的接口;
             
                                                      图 1 deque的逻辑结构
             
                                                  图 2  deque的内部结构

Deque的能力

 与vector相比,deque功能上的不同之处在于:
  • 首尾两端都能快速的安插、删除元素,因此需要在两端安插、删除元素时,最好采用deque。
  • 存在元素时,deque的内部结构会多一个间接过程,操作元素的效率会比vector低一些。
  • 迭代器需要在不同区块间跳转,所以必须是特殊的智能指针,非一般指针。
  • deque不支持对容量和内存重分配时机的控制,除了首尾两端安插、删除元素外,其他地方安插、删除元素都将导致元素的pointer、reference、iterator失效。不过,deque的内存重分配机制优于vector,因为deque不必在内存重分配时复制所有的元素。
  • deque的内存区块不再被使用时,会被释放。
deque的操作函数:
          Deque的操作函数和vector操作函数基本一模一样,操作函数列表见STL之vector函数详解
duque的各项操作只有以下几点和vector不同:
  1. deque不提供容量操作( capacity()、reserve() )
  2. deque提供push_front()、pop_front()函数直接操作头部
Deque的特点:
从deque的内部结构可知,deque元素是分布在一段段连续空间上,因此deque具有如下特点:
1、支持随机访问,即支持[]以及at(),但是性能没有vector好。
2、可以在内部进行插入和删除操作,但性能不及list。
由于deque在性能上并不是最高效的,有时候对deque元素进行排序,更高效的做法是,将deque的元素移到到vector再进行排序,然后在移到回来。

举例

       我们操作deque时,不需要关心其内部结构的实现,我们按照deque的逻辑结构进行操作,可以认为deque是动态的一维数组,可在首尾进行插入、删除操作,下标从0开始。
#include "stdafx.h"
#include <deque>
#include <string>
#include <iostream>
#include <algorithm>using namespace std;void DequeExample()
{deque<string> strDeq;//空队列strDeq.assign(3, string("string"));//赋值//打印deque的内容for (unsigned i = 0; i < strDeq.size(); i++){cout << "strDeq[" << i << "] :"  << strDeq[i] << endl;}cout << "push_front and push_back elem to deque" << endl;//首尾插入元素strDeq.push_front("first string");strDeq.push_back("last string");//打印deque的内容for (unsigned i = 0; i < strDeq.size(); i++){cout << "strDeq[" << i << "] :" << strDeq[i] << endl;}cout << "pop_front and pop_back elem from deque" << endl;//首尾弹出元素strDeq.pop_front();strDeq.pop_back();//打印deque的内容for (unsigned i = 0; i < strDeq.size(); i++){cout << "strDeq[" << i << "] :"  << strDeq[i] << endl;}
}

运行结果

          
参考文章:
       1.http://blog.csdn.net/xiajun07061225/article/details/7442816
       2.http://blog.csdn.net/hackbuteer1/article/details/7729451

转载于:https://www.cnblogs.com/jinxiang1224/p/8468418.html

STL之deque详解相关推荐

  1. c语言stl模板,c/c++开发分享C++ 标准模板库 STL 顺序容器详解

    c++ 标准模板库 stl 顺序容器 容器 顺序性 重复性 支持迭代器 vector 动态数组 无序 可重复 随机访问迭代器 deque 双向队列 无序 可重复 随机访问迭代器 list 双向链表 无 ...

  2. [学习C++ ]C++ STL 全排列函数详解(排列组合与匹配算法)--1

    一.概念 从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列.当m=n时所有的排列情况叫全排列.如果这组数有n个,那么全排列数为n!个. 比如a ...

  3. STL 之vector详解

    STL之vector容器详解 vector 容器 vector是C++标准模版库(STL,Standard Template Library)中的部分内容.之所以认为是一个容器,是因为它能够像容器一样 ...

  4. C++STL笔记(五):Deque详解

    Deque结构   有着和vector几乎一模一样的接口,不同的是Deque的dynamic array头尾都开放,因此能在头尾两端进行快速安插和删除. 一.Deque的构造函数和析构函数 二.Deq ...

  5. STL sort()函数详解

    西方有句谚语:不要重复发明轮子! STL几乎封装了所有的数据结构中的算法,从链表到队列,从向量到堆栈,对hash到二叉树,从搜索到排序,从增加到删除......可以说,如果你理解了STL,你会发现你已 ...

  6. STL—queue(队列) 详解

    首先,在STL中 queue 和 stack 其实并不叫容器(container),而是叫适配器(adapter),他们是对容器的再封装. 队列queue: 队列,简称对,是一种操作受限的线性表.限制 ...

  7. C++中STL各个迭代器详解

    1.自C++11起可以用range-based for循环来所有元素,但有时并不需要处理所有元素,此时可以使用迭代器. std::vector<int> vec {1,2,3,4,5,6, ...

  8. C++(STL):34--- multiset容器详解

    前面章节中,对 set 容器做了详细的讲解.回忆一下,set 容器具有以下几个特性: 不再以键值对的方式存储数据,因为 set 容器专门用于存储键和值相等的键值对,因此该容器中真正存储的是各个键值对的 ...

  9. C++ STL之vector详解

    转自http://blog.sina.com.cn/s/blog_9f1c0931010180cy.html Vectors    vector是C++标准模板库中的部分内容,它是一个多功能的,能够操 ...

最新文章

  1. SharePoint【Query Options系列】-- Query Options的一些用法 01. 展开用户列信息
  2. Springboot整合xxl-job实现任务自定义定时任务
  3. 1050 循环数组最大子段和
  4. 在JDK 8中连接字符串
  5. Flowable 数据库表结构 ACT_HI_PROCINST
  6. python学习--交互式图形编程实例四
  7. 关于java的回调方法
  8. GridView 水平方向滑动
  9. 服务器网卡无法开启lldp协议,lldp支持-VMware vSphere - 思科华为论坛
  10. 对话机器学习大神Yoshua Bengio(下)
  11. C#调用RDP,实现远程桌面共享及控制
  12. 傲腾readyboost_从提示框:自动耳机音量调节,Compact Windows ReadyBoost和安全电话充电...
  13. 后台界面也可以很酷!31个高大上的后台管理系统模版
  14. FPGA控制AD7606进行数据采集
  15. 传奇单职业1.76御天战神强势来袭
  16. 2020-8-15词汇
  17. 双服务器架构实战飞桨部署-自动上色和老相片修复
  18. [Ubuntu] ubuntu/LINUX游戏集锦(更新十余款大型3D游戏)
  19. AIX日志型文件系统的nbpi
  20. 炼钢行业皮带无人化管理的问题及解决

热门文章

  1. 学习笔记(11月03日)
  2. Git初学使用命令记录
  3. Mybatis学习--Mapper.xml映射文件
  4. Android API之android.net.wifi.WifiConfiguration
  5. ToolBarTray与ToolBarPanel的区别
  6. shell scripts 之 代码量统计
  7. oracle pipelined返回值函数 针对数据汇总统计 返回结果集方法
  8. 关于MVC项目目录结构调整的想法
  9. Golden Gate 与 Oracle DataGuard的区别
  10. Java基础—复制之深拷贝与浅拷贝