博客
关于我
STL—deque使用及源码剖析
阅读量:519 次
发布时间:2019-03-07

本文共 2414 字,大约阅读时间需要 8 分钟。

deque 概述

deque,也叫双端队列,是一种支持高效插入和删除容器双端元素的数据结构。与向量类似,deque 允许随机访问元素,并且内部通过连续的分段版本实现,给使用者创造了连续的使用感受。其独特之处在于,它不仅支持尾部操作(如向量),还支持头部操作,因此名为双端队列。

deque 的主要特点是支持双端插入和删除操作,且其底层结构为分段连续的数组,虽然内部逻辑复杂,但使用者可以像使用向量一样方便地进行操作。

deque 的常用功能

构造函数

  • deque():创建空 deque。

  • deque(int nSize):创建包含 nSize 个元素的 deque。

  • deque(int nSize, const T& t):创建包含 nSize 个元素且值均为 t 的 deque。

  • deque(const deque&):复制构造函数。

增加函数

  • void push_front(const T& x):在 deque 的头部添加一个元素 x。

  • void push_back(const T& x):在 deque 的尾部添加一个元素 x。

  • iterator insert(iterator it, const T& x):在 it 前的位置插入一个元素 x。

  • void insert(iterator it, int n, const T& x):在 it 前的位置插入 n 个元素 x。

  • void insert(iterator it, const_iterator first, const_iterator last):在 it 前的位置插入 first 到 last 之间的元素。

删除函数

  • iterator erase(iterator it):删除 deque 中的某个元素。

  • iterator erase(iterator first, iterator last):删除 deque 中 first 到 last 之间的元素。

  • void pop_front():删除头部元素。

  • void pop_back():删除尾部元素。

  • void clear():清空 deque。

遍历函数

  • reference at(int pos):返回 pos位置元素的引用。

  • reference front():返回首元素的引用。

  • reference back():返回尾元素的引用。

  • iterator begin():返回向量头指针。

  • iterator end():返回指向末尾元素后一个位置的指针。

  • reverse_iterator rbegin():反向迭代器,指向最后一个元素。

  • reverse_iterator rend():反向迭代器,指向第一个元素前一个元素。

判断函数

  • bool empty() const:判断 deque 是否为空。

容量和大小函数

  • int size() const:返回元素个数。

  • int max_size() const:返回最大允许元素数量。

其他函数

  • void swap(deque&):交换两个 deque。

  • void assign(int n, const T& x):将元素的值设为 x。

deque 源码剖析

deque 内部是分段连续的,其使用者显示为连续。以下是 deque 的源码概述:

template 
class deque {public: typedef T value_type; enum { _S_Bits = ImplementationDefined }; iterator begin() { return start; } iterator end() { return finish; } size_type size() const { return finish - start; } // 其他函数};

控制中心

deque 的控制中心(map)类型设为 T**,每个指针指向一个 buffer。控制中心用于管理 deque 的线性性质。

deque 迭代器

deque 的迭代器通过模拟空间的连续性实现了线性响应:

template 
struct __deque_iterator { // 迭代器属性 iterator Category = random_access_iterator_tag; T value_type; ptr pointer; Ref reference; size_t size_type; T** map_pointer; // 以及其他成员};

插入方法

deque 的 insert 方法根据插入位置选择前迁移或后迁移策略:

iterator insert(iterator position, const value_type& x) {    if (position.cur == start.cur) {        push_front(x);        return start;    } else if (position.cur == finish.cur) {        push_back(x);        iterator tmp = finish;        --tmp;        return tmp;    } else {        return insert_aux(position, x);    }}

这是一篇关于 deque 数据结构详细介绍,涵盖其概述、使用方法、源码剖析以及具体的实现细节。deque 被广泛应用于需要高效双端操作的场景,如系统编程和实时应用中,其性能和灵活性使其成为开发者的理想选择。

转载地址:http://scjnz.baihongyu.com/

你可能感兴趣的文章
openlayers 入门教程(四):layers 篇
查看>>
OpenLayers 项目分析(三)-OpenLayers中定制JavaScript内置类
查看>>
Openlayers下载与加载geoserver的wms服务显示地图
查看>>
Openlayers中使用Cluster+Overlay实现点击单个要素和聚合要素时显示不同弹窗
查看>>
Openlayers中使用Cluster实现点位元素重合时动态聚合与取消聚合
查看>>
Openlayers中使用Cluster实现缩放地图时图层聚合与取消聚合
查看>>
Openlayers中使用Image的rotation实现车辆定位导航带转角(判断车辆图片旋转角度)
查看>>
Openlayers中使用Overlay实现点击要素弹窗并且弹窗随之移动
查看>>
Vmware系列&虚拟机系列【仅供参考】:使用vCenter Auto Deploy制作ESXI系统封装(适合高版本vSphere)
查看>>
Openlayers中加载GeoJson文件显示地图
查看>>
Openlayers中加载Geoserver切割的EPSG:900913离线瓦片图层组
查看>>
Openlayers中加载Geoserver切割的EPSG:900913离线瓦片地图并显示
查看>>
Openlayers中多图层遮挡时调整图层上下顺序
查看>>
Openlayers中实现地图上打点并显示图标和文字
查看>>
Openlayers中实现地图上添加一条红色直线
查看>>
Openlayers中将某个feature置于最上层
查看>>
Openlayers中点击地图获取坐标并输出
查看>>
Openlayers中设置定时绘制和清理直线图层
查看>>
Openlayers入门教程 --- 万字长篇
查看>>
Openlayers各组件默认的css样式
查看>>