注:原创不易,转载请务必注明原作者和出处,感谢支持!

注:内容来自某培训课程,不一定完全正确!

一 deque容器

1.1 deque容器基本概念

如上图所示,双端队列deque是一个双口容器,它可以同时在首尾两边进行插入和删除。

push_front();	// 头部插入
pop_front(); // 头部删除
push_back(); // 尾部插入
pop_back(); // 尾部删除 front(); // 返回队首元素
back(); // 返回队尾元素 dq.begin(); // 起始迭代器
dq.end(); // 终止迭代器

deque是“double-ended queue”的缩写,和vector一样,deque也支持随机存取。vector是单向开口的连续性空间,deque则是一种双向开口的连续性空间,所谓双向开口,意思是可以在头尾两段分别做元素的插入和删除操作,vector当然也可以在头尾两段进行插入和删除操作,但是头部插入和删除操作效率奇差,无法接受。

deque和vector最大的差异在于:

(1)deque允许常数时间内对头端进行元素插入和删除操作。

(2)deque没有容量的概念,因为它是动态的以分段的连续空间组合而成,随时可以增加一段新的空间并链接起来,换句话说,像vector那样“因为旧空间不足而重新分配一块更大的空间,然后再复制元素,释放空间”这样的操作不会发生在deque身上,也因此deque没有必要提供所谓的空间保留功能。

deque的特性总结如下:

(1)双端插入和删除元素效率较高

(2)指定位置插入也会导致数据元素移动,降低效率

(3)可随机存取,效率高

如上图所示是deque的内部实现原理示意图。对deque中的元素进行排序一般是选择将deque中的元素拷贝到vector中,在vector中完成排序之后再将排序后的元素拷贝回deque当中。

1.2 deque构造函数

// 默认构造形式
deque<T> dq; // 构造函数将[beg, end)区间中的元素拷贝给本身
deque(beg, end) // 构造函数将n个elem拷贝给本身
deque(n, elem); // 拷贝构造函数
deque(const deque &deq);

1.3 deque赋值操作

// 将[beg, end)区间中的数据拷贝赋值给本身
assign(beg, end); // 将n个elem拷贝赋值给本身
assign(n, elem); // 重载等号操作符
deque &operator=(const deque &dep); // 将deq与本身的元素互换
swap(dep);

1.4 deque大小操作

// 返回容器中元素的个数
deque.size(); // 判断容器是否为空
deque.empty(); // 重新制定容器长度为num,若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除
deque.resize(num); // 制定填充的默认值
deque.resize(num);

1.5 deque双端插入和删除操作

// 在容器尾部和首部插入元素
push_back(elem);
push_front(elem); // 在容器尾部和首部删除元素
pop_back();
pop_front();

1.6 deque数据存取

// 返回索引idx所指的数据,如果idx越界,则抛出out_of_range异常
at(idx); // 返回索引idx所指的数据,如果idx越界,不抛出异常,程序
operator[]; // 返回首部元素
front(); // 返回末尾元素
back();

1.7 deque插入和删除

// 往位置position处插入元素val
insert(const_iterator position, const valtype &val); // 清空容器中的元素
clear(); // 删除[beg, end)区间的数据,返回下一个数据的位置
erase(beg, end); // 删除pos位置的数据,返回下一个数据的位置
erase(pos);

1.8 deque应用案例

// 选手类型
class Player
{
public:
Player() {}
Player(string name, int score) : mName(name), mScore(score) {} public:
string mName;
int mScore;
}; // 创建选手
void CreatePlayer(vector<Player> &v)
{
string nameList = "ABCDE";
for (int i = 0; i < 5; ++i)
{
Player p;
p.mName = "选手";
p.mName += nameList[i];
p.mScore = 0; v.push_back(p);
}
} // 打分
void SetScore(vector<Player> &v)
{
for (vector<Player>::iterator it = v.begin(); it != v.end(); ++it)
{
// 10个评委打分
deque<int> dScore;
for (int i = 0; i < 10; ++i)
{
int score = rand() % 41 + 60;
dScore.push_back(score);
} // 对分数排序
sort(dScore.begin(), dScore.end());
// 去除最高和最低分
dScore.pop_back();
dScore.pop_front();
// 求平均分
int totalScore = 0;
for (deque<int>::iterator dit = dScore.begin(); dit != dScore.end(); ++dit)
totalScore += (*dit);
int avgScore = totalScore / dScore.size(); // 保存平均分
it->mScore = avgScore;
}
} // 排序规则
bool cmp(Player &p1, Player &p2)
{
return (p1.mScore > p2.mScore);
} // 得分排名
void PrintRank(vector<Player> &v)
{
// 从大到小排序
sort(v.begin(), v.end(), cmp);
for (vector<Player>::iterator it = v.begin(); it != v.end(); ++it)
{
cout << "name : " << it->mName << " score : " << it->mScore << endl;
}
} int main()
{
vector<Player> v;
CreatePlayer(v);
SetScore(v);
PrintRank(v); getchar();
return 0;
}

C++ STL——deque的更多相关文章

  1. STL deque详解

    英文原文:http://www.codeproject.com/Articles/5425/An-In-Depth-Study-of-the-STL-Deque-Container 绪言 这篇文章深入 ...

  2. STL Deque 容器

    STL Deque 容器 Deque简介 deque是“double-ended queue”的缩写,和vector一样都是STL的容器,deque是双 端的,而vector是单端的.         ...

  3. 浅谈C++ STL deque 容器

    浅谈C++ STL deque 容器 本篇随笔简单介绍一下\(C++STL\)中\(deque\)容器的使用方法及常见使用技巧. deque容器的概念 \(deque\)的意义是:双端队列.队列是我们 ...

  4. [STL]deque和stack、queue

    怎么说呢,deque是一种双向开口的连续线性空间,至少逻辑上看上去是这样.然而事实上却没有那么简单,准确来说deque其实是一种分段连续空间,因此其实现以及各种操作比vector复杂的多. 一.deq ...

  5. STL deque

      STL之deque容器详解 Deque 容器 deque容器是C++标准模版库(STL,Standard Template Library)中的部分内容.deque容器类与vector类似,支持随 ...

  6. STL deque用法

    Deque 容器 deque容器是C++标准模版库(STL,Standard Template Library)中的部分内容.deque容器类与vector类似,支持随机访问和快速插入删除,它在容器中 ...

  7. STL~Deque简介

    转自百度经验deque简介 deque是双向开口的连续性存储空间.虽说是连续性存储空间,但这种连续性只是表面上的,实际上它的内存是动态分配的,它在堆上分配了一块一块的动态储存区,每一块动态存储去本身是 ...

  8. STL --> deque双向队列

    deque简介 deque是双向开口的连续性存储空间.虽说是连续性存储空间,但这种连续性只是表面上的,实际上它的内存是动态分配的,它在堆上分配了一块一块的动态储存区,每一块动态存储去本身是连续的,de ...

  9. C++STL deque

    deque双端数组 deque<int> dq; deque<int>::iterator it; dq.push_back();//尾部插入元素 dq.push_front( ...

  10. 计蒜客 A2232.程序设计:蒜厂年会-单调队列(双端队列(STL deque)实现)滑窗维护最小前缀和

    程序设计:蒜厂年会 问答问题反馈 只看题面 16.79% 1000ms 262144K   在蒜厂年会上有一个抽奖,在一个环形的桌子上,有 nn 个纸团,每个纸团上写一个数字,表示你可以获得多少蒜币. ...

随机推荐

  1. 如何使用Marketing Cloud的扩展字段作为搜索条件进行搜索

    需求:我在Marketing Cloud的contact模型上用custom field这个应用创建了一个Extension field,名称为微信ID. 现在客户的需求是使用这个字段作为过滤条件进行 ...

  2. 处理Android键盘覆盖input和textarea框的问题

    $(window).resize(function(){ $('input[type="text"],textarea').on('click', function () { va ...

  3. Linux文件的管理

    创建:touch  vim/vi  echo重定向  cat touch 管理: atime  mtime touch  文件名  //如果文件不存在,不创建文件 删除:mv /tmp find |x ...

  4. web开发:Bootstrap应用及内存管理

    一.栅格系统 二.移动端适配 三.栅格系统案例 四.表格 五.表单 六.循环应用 一.栅格系统 <!DOCTYPE html> <html> <head> < ...

  5. linux usb驱动记录(一)

    一.linux 下的usb驱动框架 在linux系统中,usb驱动可以从两个角度去观察,一个是主机侧,一个是设备侧.linux usb 驱动的总体框架如下图所示:   从主机侧看usb驱动可分为四层: ...

  6. YOLO---Darknet下的学习笔记

    YOLO.V3-Darknet下的学习笔记 @wp20180927 [目录] 一. 安装Darknet(仅CPU下) 2 1.1在CPU下安装Darknet方式 2 1.2在GPU下安装Darknet ...

  7. django国际化的简单设置

    设置国际化的具体步骤: 一.国际化 1)效果:针对不同的国家的人可以配置不同的语言(一般是英文和中文,  English  Chinese) 2)目的:增加项目的用户量 3)难度:不难 比较费劲的就是 ...

  8. HashMap源码分析三

      HashMap的源码,在jdk1.5中相比jdk1.4,改动不大,有几个方面   1 jdk1.5中引入了范型,在HashMap中也有体现 2 引入了另一个hash值的计算方式,不过默认是关闭状态 ...

  9. tsung压力测试环境部署详细步骤(内附安装包)

    操作系统: Redhat 6.3.Redhat6.5 .centos7.4(这些版本已验证过) tsung版本: tsung-1.6.0 下载地址: 链接: https://pan.baidu.com ...

  10. python常用函数拾零

    Python常用内置函数总结: 整理过程中参考了runoob网站中python内置函数的相关知识点,特此鸣谢!! 原文地址:http://www.runoob.com/python/python-bu ...