STL容器之Deque-《C++标准库(第二版)》读书笔记
写在前面:本文是阅读《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相比,功能上的差异如下:
- 两端都能快速安插元素和移除元素(vector只能在尾部可以)。这些操作可以在摊提的常量时间内完成。
- 访问元素时deque内部结构会多一个间接过程,所以元素的访问和迭代器的动作会稍微慢一些。
- 迭代器需要在不同的区块间跳转,所以必须是个smart pointer,不能是个普通的pointer。
- 在内存区块大小有限制的系统中,deque可以内含更多元素,因为它使用不止一块内存。因此deque的max_size()可能更大。
- Deque不支持对容量和内存重新分配时机的控制。特别要注意的是,除了头尾两端,在任何地点安插和删除元素都将导致指向deque元素的任何pointer、reference和iterator失效。不过,deque 的内存重分配由于vector,因为其内部结构显示,deque不必在内存重新分配时复制所有元素。
- Deque会释放不再使用的内存区块。deque的内存大小使可所建的,但要不要这么做,以及如何做,由实现决定。
Deque的的以下特性和vector差不多:
- 在中段安插、移除元素的速度相对较慢,因为所有元素都需要移动以腾出或者填补空间。
- 迭代器属于random-access iterator(随机访问迭代器)。
总之,以下情形最好使用deque:
- 你需要在两端安插和删除元素(这是deque的拿手好戏)。
- 无需指向容器内的元素。
- 要求”不再使用的元素必须释放“(不过,C++ standard 对此无任何保证)。
7.4.2 Deque的操作函数
下面列出了deque的操作函数。
deque的各项操作只有以下两点和vector不同:
- deque不提供容量操作 (capacity()和reserve()).
- deque直接提供函数完成头部元素的安插和删除(push_front()和pop_front())。
其他操作都相同。
请注意,C++11 添加了 shrink_to_fit() ,那是个不具有强制力(nonbinding)的函数,负责缩小内部内存以匹配元素个数。你可能会认为shrink_to_fit()对deque没意义,因为deque本来就会释放不再使用的区块内存。然而,deque内部用来存放”指向独立区块“的所有pointer的空间,通常不会被缩小,如果用了这个函数就有可能真的被缩小。
还有一些值得考虑的事情:
- 除了at(),没有任何成员函数会检查”索引或迭代器是否有效“。
- 除了头尾两端,在任何地点安插和删除元素都将导致指向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++标准库(第二版)》读书笔记相关推荐
- 标准模板库之容器-《C++标准库(第二版)》读书笔记
写在前面:本文是阅读<C++标准库(第二版)>的读书笔记. 文章目录 6.1 STL组件(Component) 6.2 容器(Container) 6.2.1 序列式容器(Sequence ...
- 通用工具之Pair和Tuple-《C++标准库(第二版)》读书笔记
写在前面:本文是阅读<C++标准库(第二版)>的读书笔记. 文章目录 5.1 Pair 和Tuple 5.1.1 Pair 元素访问 构造函数和赋值 逐块式构造 便捷函数make_pair ...
- C++11语言新特性-《C++标准库(第二版)》读书笔记
文章目录 3.1.1 微小但重要的语法提升 Template 表达式内的空格 nullptr 和std::nullptr_t 3.1.2 以auto 完成自动类型推导 3.1.3 一致性初始化(Uni ...
- C++标准库(第二版,作者_NicolaiMJosuttis)_第六章标准模板库_概述
本文是一篇读书笔记,可以在偏向文字叙述方面让你了解STL,代码涉及到的不多,如果你明天面试,看看整个也许有点帮助,笔者就曾经被人问到:vector和list有什么区别?很遗憾当时我没有回答上来,现在的 ...
- C++ STL 容器之 deque简单使用
#define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std; #include <deque> ...
- STL容器之deque
双端队列:序列式容器(deque/vector):底层分段连续 支持从双端进行插入和删除: 综合了vector和list的优点: 插入.删除.查找的平均时间复杂度都是O(1) 部分deque的操作如下 ...
- C++标准库(第二版).pdf与STL源码剖析.pdf下载
链接:https://pan.baidu.com/s/1KJjkz19AdFd_UHQzBwHd8A 提取码:2191 链接:https://pan.baidu.com/s/1754Oi4BdBE2s ...
- C++标准库(第二版,作者_NicolaiMJosuttis)_第六章标准模板库_6.2.4关联式数组
key/value pair 形式的集合也可以看作式一个关联式的数组,也即是索引并非整数的数组,因此这两个容器(map,unordered map)都提供了下标操作符[]. // STL_AssoAr ...
- Python核心教程(第二版)读书笔记(三)
第三章Python基础 2010-04-09 换行 一行过长的语句可以使用反斜杠'\'分解成几行.有两种例外情况一个语句不使用反斜线也可以跨行. 1.在使用闭合操作符时,单一语句可以跨多行.例如:在 ...
最新文章
- 计算机图形学——BRDF
- ubuntu 上code blocks 建glut工程时问题
- mysql 优化(一)
- 大数据学习,Hive是丢不掉的!Hive练习题50道,你也试试!
- GIT项目管理工具(part6)--放弃工作区文件修改及从仓库区恢复文件
- MATLAB字符串转换函数
- logging记录日志
- so easy 的弹出层——使用jquery
- 计算机无法加载操作系统,由于关键系统驱动程序丢失或包含错误,因此无法加载操作系统。解决方案...
- QQ空间无法修改“空间描述”修复方法
- 《平衡掌控者 游戏数值战斗设计》学习笔记(三)战斗公式
- Linux学习-MySQL变量学习
- 移动通信各制式、调制的速率及频谱利用率(2G-4G)
- mysql实现统计查询_MySQL 统计查询实现代码
- OGNL中#、%和$的用法
- 这些逻辑运算符你都使用正确了吗?
- Linux培训哪家靠谱?过来人教你如何挑选培训机构
- java计算机毕业设计学生管理系统MyBatis+系统+LW文档+源码+调试部署
- CUDA版本降级操作(记录)
- CUDA out of memory. Tried to allocate 16.00 MiB (GPU 0; 6.00 GiB total capacity;总结(1)