写在前面:本文是阅读《C++标准库(第二版)》的读书笔记。

文章目录

  • 7.4 Deque
    • 7.4.1 Deque的能力
    • 7.4.2 Deque的操作函数
    • 7.4.3 Exception Handling
    • 7.4.4 Deque运用实例

7.4 Deque

容器deque(发音为“deck”)和vector非常相似。它也采用dynamic array来管理元素,提供随机访问,并有着和vector几乎一模一样的接口。不同的是deque的dynamic array头和尾都开放,因此能在头尾两端进行快速安插和删除。

为了提供这种能力,deque通常实现为一组独立区块(a bunch of individual blocks) ,第一区块朝向某方向扩展,最后的区块朝另一方向扩展。

使用deque之间,必须先包含头文件< deque> :#include< deque>
其中,deque类型定义于命名空间std内的一个 class template:

namespace std{tamplate< typename T,typename Allocator = allocator<T>>class deque;
}

和vector相同,这里的第一个template参数用来指明元素类型,第二个template实参可有可无,用来指定内存模型(memory model),默认为allocator.

7.4.1 Deque的能力

Deque和vector相比,功能上的差异如下:

  1. 两端都能快速安插元素和移除元素(vector只能在尾部可以)。这些操作可以在摊提的常量时间内完成。
  2. 访问元素时deque内部结构会多一个间接过程,所以元素的访问和迭代器的动作会稍微慢一些。
  3. 迭代器需要在不同的区块间跳转,所以必须是个smart pointer,不能是个普通的pointer。
  4. 在内存区块大小有限制的系统中,deque可以内含更多元素,因为它使用不止一块内存。因此deque的max_size()可能更大。
  5. Deque不支持对容量和内存重新分配时机的控制。特别要注意的是,除了头尾两端,在任何地点安插和删除元素都将导致指向deque元素的任何pointer、reference和iterator失效。不过,deque 的内存重分配由于vector,因为其内部结构显示,deque不必在内存重新分配时复制所有元素。
  6. Deque会释放不再使用的内存区块。deque的内存大小使可所建的,但要不要这么做,以及如何做,由实现决定。

Deque的的以下特性和vector差不多:

  1. 在中段安插、移除元素的速度相对较慢,因为所有元素都需要移动以腾出或者填补空间。
  2. 迭代器属于random-access iterator(随机访问迭代器)。

总之,以下情形最好使用deque:

  • 你需要在两端安插和删除元素(这是deque的拿手好戏)。
  • 无需指向容器内的元素。
  • 要求”不再使用的元素必须释放“(不过,C++ standard 对此无任何保证)。

7.4.2 Deque的操作函数

下面列出了deque的操作函数。

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

  1. deque不提供容量操作 (capacity()和reserve()).
  2. deque直接提供函数完成头部元素的安插和删除(push_front()和pop_front())。

其他操作都相同。

请注意,C++11 添加了 shrink_to_fit() ,那是个不具有强制力(nonbinding)的函数,负责缩小内部内存以匹配元素个数。你可能会认为shrink_to_fit()对deque没意义,因为deque本来就会释放不再使用的区块内存。然而,deque内部用来存放”指向独立区块“的所有pointer的空间,通常不会被缩小,如果用了这个函数就有可能真的被缩小。

还有一些值得考虑的事情:

  1. 除了at(),没有任何成员函数会检查”索引或迭代器是否有效“。
  2. 除了头尾两端,在任何地点安插和删除元素都将导致指向deque元素的任何pointer、reference和iterator失效。

7.4.3 Exception Handling

原则上deque提供的异常处理和vector提供的一样。新增的操作函数push_front()和pop_front()分别对应于push_back()和pop_back()。因此C++标准库保证下列行为:
如果以push_back() 、 push_front()安插元素时发生异常,则该操作不带来任何效应。
pop_back()和 pop_front() 不会抛出任何异常。

7.4.4 Deque运用实例

#include<iostream>
#include<deque>
#include<iterator>
#include<algorithm>
#include<string>
using namespace std;int main(){//create empty deque of stringsdeque<string> coll;//insert several elementscoll.assign(3,string("string"));//复制3个 ”string“ ,赋值给coll coll.push_back("last string") ; //尾部添加一个字符串 coll.push_front("first string"); //头部添加一个字符串 //print elements separated by newlinescopy( coll.cbegin(),coll.cend(),ostream_iterator<string>(cout,"\n"));cout<<endl;//remove first and last elementcoll.pop_back();coll.pop_front();//insert "another" into every element but the firstfor(int i=1; i<coll.size();i++)coll[i]="another"+coll[i];// change size to four elementscoll.resize(4,"resized string"); //将元素数量改为4,如果size()变大,多出来的新元素都是”resized string“的拷贝 //print elements separated by newlinescopy( coll.cbegin(),coll.cend(),ostream_iterator<string>(cout,"\n"));cout<<endl;}

输出结果

STL容器之Deque-《C++标准库(第二版)》读书笔记相关推荐

  1. 标准模板库之容器-《C++标准库(第二版)》读书笔记

    写在前面:本文是阅读<C++标准库(第二版)>的读书笔记. 文章目录 6.1 STL组件(Component) 6.2 容器(Container) 6.2.1 序列式容器(Sequence ...

  2. 通用工具之Pair和Tuple-《C++标准库(第二版)》读书笔记

    写在前面:本文是阅读<C++标准库(第二版)>的读书笔记. 文章目录 5.1 Pair 和Tuple 5.1.1 Pair 元素访问 构造函数和赋值 逐块式构造 便捷函数make_pair ...

  3. C++11语言新特性-《C++标准库(第二版)》读书笔记

    文章目录 3.1.1 微小但重要的语法提升 Template 表达式内的空格 nullptr 和std::nullptr_t 3.1.2 以auto 完成自动类型推导 3.1.3 一致性初始化(Uni ...

  4. C++标准库(第二版,作者_NicolaiMJosuttis)_第六章标准模板库_概述

    本文是一篇读书笔记,可以在偏向文字叙述方面让你了解STL,代码涉及到的不多,如果你明天面试,看看整个也许有点帮助,笔者就曾经被人问到:vector和list有什么区别?很遗憾当时我没有回答上来,现在的 ...

  5. C++ STL 容器之 deque简单使用

    #define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std; #include <deque> ...

  6. STL容器之deque

    双端队列:序列式容器(deque/vector):底层分段连续 支持从双端进行插入和删除: 综合了vector和list的优点: 插入.删除.查找的平均时间复杂度都是O(1) 部分deque的操作如下 ...

  7. C++标准库(第二版).pdf与STL源码剖析.pdf下载

    链接:https://pan.baidu.com/s/1KJjkz19AdFd_UHQzBwHd8A 提取码:2191 链接:https://pan.baidu.com/s/1754Oi4BdBE2s ...

  8. C++标准库(第二版,作者_NicolaiMJosuttis)_第六章标准模板库_6.2.4关联式数组

    key/value pair 形式的集合也可以看作式一个关联式的数组,也即是索引并非整数的数组,因此这两个容器(map,unordered map)都提供了下标操作符[]. // STL_AssoAr ...

  9. Python核心教程(第二版)读书笔记(三)

    第三章Python基础 2010-04-09 换行  一行过长的语句可以使用反斜杠'\'分解成几行.有两种例外情况一个语句不使用反斜线也可以跨行. 1.在使用闭合操作符时,单一语句可以跨多行.例如:在 ...

最新文章

  1. 计算机图形学——BRDF
  2. ubuntu 上code blocks 建glut工程时问题
  3. mysql 优化(一)
  4. 大数据学习,Hive是丢不掉的!Hive练习题50道,你也试试!
  5. GIT项目管理工具(part6)--放弃工作区文件修改及从仓库区恢复文件
  6. MATLAB字符串转换函数
  7. logging记录日志
  8. so easy 的弹出层——使用jquery
  9. 计算机无法加载操作系统,由于关键系统驱动程序丢失或包含错误,因此无法加载操作系统。解决方案...
  10. QQ空间无法修改“空间描述”修复方法
  11. 《平衡掌控者 游戏数值战斗设计》学习笔记(三)战斗公式
  12. Linux学习-MySQL变量学习
  13. 移动通信各制式、调制的速率及频谱利用率(2G-4G)
  14. mysql实现统计查询_MySQL 统计查询实现代码
  15. OGNL中#、%和$的用法
  16. 这些逻辑运算符你都使用正确了吗?
  17. Linux培训哪家靠谱?过来人教你如何挑选培训机构
  18. java计算机毕业设计学生管理系统MyBatis+系统+LW文档+源码+调试部署
  19. CUDA版本降级操作(记录)
  20. CUDA out of memory. Tried to allocate 16.00 MiB (GPU 0; 6.00 GiB total capacity;总结(1)

热门文章

  1. 子选择器与后代选择器的区别
  2. Prim算法 求出 最小生成树
  3. iOS 界面上绘制不同字体 颜色 大小的字符串
  4. 快速生成解决方案 ctrl + shilf + b
  5. solr dataimport 数据导入源码分析(二)
  6. ahk编程_AHK编程可视化的实现
  7. python3软件怎么使用_Python3时间戳如何应用于数学计算?
  8. 第10章* 网络 幂律分布
  9. Python中多个数组行合并及列合并的方法总结
  10. 【DIY】可能是最简单粗暴、省钱省电的家用温湿度计解决方案