C++ STL容器deque和vector很类似,也是采用动态数组来管理元素。

使用deque之前需包含头文件:

#include <deque>

它是定义在命名空间std内的一个class template:

template<class _Ty,
class _Ax = allocator<_Ty> >
class deque;

第一个template参数用来表示元素型别,第二个可有可无,指定内存模型。一般使用默认的内存模型。

与vector不同的是deque的动态数组首尾都开放,因此能够在首尾进行快速地插入和删除操作。

deque的逻辑结构:

deque的内部结构

deque是一种优化了的对序列两端元素进行添加和删除操作的基本序列容器。通常由一些独立的区块组成,第一区块朝某方向扩展,最后一个区块朝另一方向扩展。它允许较为快速地随机访问但它不像vector一样把所有对象保存在一个连续的内存块,而是多个连续的内存块。并且在一个映射结构中保存对这些块以及顺序的跟踪。

其内部结构如下图所示:

deque的特点:

1、支持随机访问,即支持[]以及at(),但是性能没有vector好。

2、可以在内部进行插入和删除操作,但性能不及list。

deque和vector的不同之处:

1、两端都能够快速插入和删除元素。vector只能在尾端进行。

2、deque的元素存取和迭代器操作会稍微慢一些。因为deque的内部结构会多一个间接过程。

3、迭代器是特殊的智能指针,而不是一般指针。它需要在不同的区块之间跳转。

4、deque可以包含更多的元素,其max_size可能更大。因为不止使用一块内存。

5、不支持对容量和内存分配时机的控制。

注意:在除了首尾两端的其他地方插入和删除元素,都将会导致指向deque元素的任何pointers、references、iterators失效。不过,deque的内存重分配优于vector。因为其内部结构显示不需要复制所有元素。

6、deque的内存区块不再被使用时,会被释放。deque的内存大小是可缩减的。不过,是不是这么做以及怎么做由实作版本定义。

deque和vector相似的特性:

1、在中间部分插入和删除元素相对较慢,因为所有元素都要被移动。

2、迭代器属于随即存取迭代器。

最好采用deque的情形:

1、需要在两端插入和删除元素。

2、无需引用容器内的元素。

3、要求容器释放不再使用的元素。

deque的操作函数

构造函数和析构函数:

非变动性操作:

变动性操作:

deque的各项操作只有一下两点和vector不同:

deque不提供容量操作:capacity()和reverse()。

deque直接提供函数完成首尾元素的插入和删除。

其他均与vector相同。

注意:

1、除了at()函数,其他成员函数都不会检查索引或迭代器是否有效。

2、元素的插入和删除可能会导致内存重新分配。所以任何插入或删除操作都会使所有指向deque元素的pointers、reference、iterators失效。唯一例外的是在首尾插入元素之后,pointers和reference可能仍然有效。

程序示例:

#include <iostream>
#include <deque>
#include <string>
#include <algorithm>using namespace std;int main()
{deque<string> strDeq;strDeq.assign(4,string("CHINA"));strDeq.push_back("first_string");strDeq.push_front("last_string");copy(strDeq.begin(),strDeq.end(),ostream_iterator<string>(cout," "));cout << endl;cout << endl;for(int i = 0;i < strDeq.size();++i)cout << "strDeq[" << i << "] : " << strDeq[i] << endl;cout << endl;for(int i = 0;i < strDeq.size();++i)cout << "strDeq.at(" << i << ") : " << strDeq.at(i) << endl;cout << endl;strDeq.pop_front();strDeq.pop_back();copy(strDeq.begin(),strDeq.end(),ostream_iterator<string>(cout," "));cout << endl;cout << endl;for(int i = 1;i < strDeq.size();++i)strDeq[i] = "pre" + strDeq[i];copy(strDeq.begin(),strDeq.end(),ostream_iterator<string>(cout," "));cout << endl;cout << endl;strDeq.resize(4,"resized string");copy(strDeq.begin(),strDeq.end(),ostream_iterator<string>(cout," "));cout << endl;cout << endl;
}

运行结果:

我的宫伀号【编程学习指南】有更多编程学习干货,欢迎围观交流~

【C++ STL学习之三】容器deque深入学习相关推荐

  1. C++ STL: 超详细 容器 deque 以及 适配器queue 和 stack 源码分析

    文章目录 前言 deque 实现 deque类 _Deque_iterator 类 deque 的元素插入 insert函数 deque如何模拟空间连续 queue 实现 stack 的实现 前言 C ...

  2. C++学习日记 容器deque、stack、list、set

    一.deque容器. 1.功能. deque容器底层实现其实就是一个双端数组,可以对头部进行插入与删除的操作. 2.deque容器迭代器? 支持随机访问迭代器. #include <iostre ...

  3. 【C++ STL学习笔记】C++ STL序列式容器(array,vector,deque,list)

    文章目录 C++ STL容器是什么? 迭代器是什么,C++ STL迭代器(iterator)用法详解 迭代器类别 迭代器的定义方式 C++序列式容器(STL序列式容器)是什么 容器中常见的函数成员 C ...

  4. Linux学习之三-Linux系统的一些重要配置文件

    Linux学习之三-Linux系统的一些重要配置文件 1.网卡配置文件 /etc/sysconfig/network-scripts/ifcfg-eth0 说明: DEVICE=eth0        ...

  5. matlab矩阵运算_MATLAB基础学习之三种基本运算

    MATLAB学习之三种运算 MATLAB软件 一.基本算数运算 在MATLAB中有两种矩阵运算:右除/和左除.如果A矩阵是非奇异方阵,则B/A等效于B*inv(A),AB等效于inv(A)*B.注:i ...

  6. STL中基本容器有: string、vector、list、deque、set、map

    为什么80%的码农都做不了架构师?>>>    在STL中基本容器有: string.vector.list.deque.set.map set 和map都是无序的保存元素,只能通过 ...

  7. 学习Docker容器时,错误bash: ping: command not found的解决方法

    问题描述: 学习Docker容器时,在容器内进行ping时出现错误,提示如下:bash: ping: command not found 解决方法: 直接安装即可,命令如下:apt-get insta ...

  8. linux内核学习之三:linux中的32位与64位

    linux内核学习之三:linux中的"32位"与"64位" 在通用PC领域,不论是windows还是linux界,我们都会经常听到"32位" ...

  9. 不会和容器一起启动_一起学习docker05-docker容器

    一起来学docker系列: 一起学docker-可视化管理01-Portainer 一起学docker-可视化管理02-Rancher 一起学习docker01-docker简介和安装 一起学习doc ...

最新文章

  1. java B2B2C springmvc mybatis多租户电子商城系统(三):服务提供与调用
  2. oracle语法垃圾,oracle 语法
  3. 个人工作总结05(第二次冲刺)
  4. 学成在线--10.页面预览
  5. 一文了解Redis持久化
  6. (217)如何选择硬件描述语言
  7. JavaScript的预解析(1)
  8. java之模块学习-接口回调机制详解
  9. 原码,补码,反码概念和计算方法详解
  10. 从含有数字的字符串中提取数字
  11. cs224w(图机器学习)2021冬季课程学习笔记15 Frequent Subgraph Mining with GNNs
  12. 触摸式开关简单入门教程
  13. Python上使用及安装tesseract
  14. java中获取一个集合(Set)的子集的方法
  15. 零样本分割系列论文(2)Open-Vocabulary Instance Segmentation via Robust Cross-Modal Pseudo-Labeling
  16. 【Lintcode】562. Backpack IV
  17. mysql 在linux环境下导出,window下导入报ASCII '\0' appeared in the statement
  18. MeRL:强化学习分配奖励机制的新方法
  19. 【物联网】linkboy轻松实现设备远程通信
  20. pyinstaller 打包的exe在某些win7上面报错 faild to execute script pyi_rth_multiprocessing

热门文章

  1. linux 字符设备驱动cdev
  2. linux内核那些事之物理内存模型之FLATMEM(1)
  3. python bytes 改值_python3 bytes 和 string转换
  4. hbase1.1.1 连接集群_HBase-1.0.1学习笔记(一)集群搭建
  5. spring mysql事物级别_mysql事务级别和spring中应用
  6. 机场精细化管理_精细化管理 | 西安咸阳国际机场关于深入推进精细化管理工作的指导意见(九)...
  7. SwitchHosts!提示没有切换权限:C:\WINDOWS\system32\drivers\etc\host 文件无法修改
  8. 织梦cms高端红酒酒业类网站模板
  9. IIS 5,6,7区别
  10. WAMP + Zend Framework + Zend Studio For Eclipse 开发环境搭建