2.4.1 引入

deque容器类比vector容器来学习。
deque为双向开口容器,见下图。而对比vector容器作为单项开口容器,在头部插入与删除的操作效率奇差。

常用API应用学习 deque容器常用API

原理机制这里不深究,本章仅探讨如何使用deque。感兴趣的同学可以自己搜索,这里放一张原理图


2.4.2 代码示例

#include<iostream>
#include<deque>
using namespace std; void printd(deque<int> &d)//打印函数(这里不需要引用&)
{
//法一
/*for (int i = 0; i < d.size(); i++)
{
cout << d[i] << " ";
}
cout << endl;*/ //法二
for (deque<int>::iterator it = d.begin(); it != d.end(); it++)
cout << *it << " ";//取*数据类型对应deque<>类型
cout << endl;
} //deque容器构造(初始化)
void text01()
{
deque<int> d1;
deque<int> d2(10, 2);
deque<int> d3(d2.begin(), d2.end());
deque<int> d4(d3); printd(d1);
printd(d2);
printd(d3);
printd(d4);
} //deque容器赋值
void text02()
{
deque<int> d1;
deque<int> d2;
deque<int> d3;
d1.assign(10, 5);
d2.assign(d1.begin(), d1.end());//迭代器指定区间赋值
d3 = d2;//等号赋值 d1.swap(d2);//交换 if (d1.empty())
{
cout << "空" << endl;
}
else
{
cout << "size:" << d1.size() << endl;
} d1.resize(5);//这里扔掉后五个元素
printd(d1);
} //deque容器插入删除
void text03()
{
deque<int> d1;
d1.push_back(100);
d1.push_front(200);
d1.push_back(300);
d1.push_front(400);
printd(d1); int val = d1.front();//拿到被删除的元素
d1.pop_front();//删除(无返回值) val = d1.back();
d1.pop_back();
printd(d1);
} int main()
{
cout << "\ntext01:\n";
text01();
cout << "\ntext02:\n";
text02();
cout << "\ntext03:\n";
text03();
return 0;
}

2.4.3 代码运行结果


2.4.4 具体案例


去除最高最低分这里用双向开口容器显然是高效的,代码如下。

//创建5个选手,姓名得分,评委为其打分
#include<iostream>
#include<vector>
#include<string>
#include<deque>
#include<algorithm>
using namespace std; class Player
{
public:
Player():name("no_name"),score(0) {}
Player(string name_,int score_):name(name_),score(score_){}
public:
string name;
int score;
};
//创建选手
void greate_play(vector<Player> &v)
{
string nameSeed = "ABCDE";
for (int i = 0; i < nameSeed.size(); i++)
{
Player p;
p.name = "选手";
p.name += nameSeed[i];
p.score = 0;
v.push_back(p);
}
}
//打分
void setScore(vector<Player> &v)
{
//打分
for (vector<Player>::iterator it = v.begin(); it != v.end(); it++)
{
deque<int> dscore;
for (int i = 0; i < 10; i++)
{
int score = rand() % 41 + 60;//60~100分
dscore.push_back(score);
}
//排序
sort(dscore.begin(), dscore.end());
//去掉最高分最低分
dscore.pop_front();
dscore.pop_back();
//求平均分
int totalScore = 0;
for (deque<int>::iterator dit = dscore.begin(); dit != dscore.end(); dit++)
{
totalScore += *dit;
}
int average = totalScore / dscore.size();
//保存分数
(*it).score = average;
}
} bool cmp(Player a, Player b)
{
return a.score > b.score;
} //排名
void printRank(vector<Player>& v)
{
sort(v.begin(), v.end(), cmp);
//打印
for (auto it = v.begin(); it != v.end(); it++)
{
cout << "name:" << (*it).name << "\t" << "score:" << (*it).score << endl;
}
} int main()
{
//定义vector
vector<Player> p;
greate_play(p);
setScore(p);
printRank(p);
return 0;
}

运行结果如下:


总结

  • 虽然deque容器不常用,但是由于其和vector容器用法比较相像,可以加深理解相关内容。
  • deque在去“头”去“尾”的案列中有较高效率。

谢谢阅读(〃’ ▽ '〃)如有纰漏欢迎指出,觉得还不错就点个赞吧。

2.4 C++STL deque容器详解的更多相关文章

  1. C++ STL bitset 容器详解

    C++ STL bitset 容器详解 本篇随笔讲解\(C++STL\)中\(bitset\)容器的用法及常见使用技巧. \(bitset\)容器概论 \(bitset\)容器其实就是个\(01\)串 ...

  2. [转]STL之deque容器详解

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

  3. 2.3 C++STL vector容器详解

    文章目录 2.3.1 引入 2.3.2 代码实例 2.3.3 运行结果 总结 2.3.1 引入 vector 容器 动态数组 可变数组 vector容器 单口容器(尾部操作效率高) vector动态增 ...

  4. 2.7 C++STL list容器详解

    文章目录 2.7.1 引入 2.7.2代码示例 2.7.3代码运行结果 总结 2.7.1 引入 STL list 容器,又称双向链表容器,即该容器的底层是以双向链表的形式实现的.这意味着,list 容 ...

  5. [C++ STL] deque使用详解

    一.deque介绍: deque(双端队列)是一个动态数组,可以向两端发展,因此不论在尾部或头部安插元素都十分迅速. 在中间部分安插元素则比较费时,因为必须移动其它元素. 二.用法 1.头文件 #in ...

  6. 【转载】[C++ STL] deque使用详解

    转载自 https://www.cnblogs.com/linuxAndMcu/p/10260124.html 一.概述 deque(双端队列)是由一段一段的定量连续空间构成,可以向两端发展,因此不论 ...

  7. 2.2 C++STL string容器详解

    文章目录 引言 2.2.1 string的特性 2.2.2 string用法理论 2.2.2.1 string构造函数 2.2.2.2 string赋值操作 2.2.2.3 string取值操作 2. ...

  8. STL Deque 容器

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

  9. STL bind1st bind2nd详解

    STL bind1st bind2nd详解   先不要被吓到,其实这两个配接器很简单.首先,他们都在头文件<functional>中定义.其次,bind就是绑定的意思,而1st就代表fir ...

随机推荐

  1. Javascript 生成全局唯一标识符 (GUID,UUID)

    全局唯一标识符(GUID,Globally Unique Identifier)也称作 UUID(Universally Unique IDentifier) . GUID是一种由算法生成的二进制长度 ...

  2. iOS开发之工欲善其事,必先利其器

    SimPholders SimPholders是一个快速简单的小工具,可以帮助开发者快速访问iPhone模拟器应用.它可以访问模拟器的文件夹,重置库和文件,以及删除选定的应用程序. 常规做法 找到Fi ...

  3. 【ASP.NET Core】设置 Web API 响应数据的格式——FormatFilter特性篇

    在上一篇烂文中老周已向各位介绍过 Produces 特性的使用,本文老周将介绍另一个特性类:FormatFilterAttribute. 这个特性算得上是筛选器的马甲,除了从 Attribute 类派 ...

  4. Git修改提交历史中的作者及邮箱信息

    一.使用rebase 如图,红圈中提交的用户名及邮箱是需要改的,则需要复制需要改的提交记录的上一个记录hashcode,在本例中就是a0a891a48f92b51201042fccbe61ed1264 ...

  5. Solution -「多校联训」朝鲜时蔬

    \(\mathcal{Description}\)   Link.   破案了,朝鲜时蔬 = 超现实树!(指写得像那什么一样的题面.   对于整数集 \(X\),定义其 好子集 为满足 \(Y\sub ...

  6. Note -「圆方树」学习笔记

    目录 圆方树的定义 圆方树的构造 实现 细节 圆方树的运用 「BZOJ 3331」压力 「洛谷 P4320」道路相遇 「APIO 2018」「洛谷 P4630」铁人两项 「CF 487E」Touris ...

  7. 【第二十三期】春招实习阶段性总结(阿里云已OC)

    本人算是一个半路出家找工作的菜鸡了,现在手中阿里云云原生offer.百度度小满offer.腾讯PCG二面环节.美团点评等offer环节.希望我的经历分享能对各位或之后准备春招的同学有帮助. 个人背景 ...

  8. 今天你花里胡哨了吗 --- 定制属于自己的linux ssh迎宾信息

    请开始你的表演 linux-oz6w:~ # cat << 'eof' > /etc/profile.d/ssh-login-info.sh #!/bin/sh # 输出一个图像 e ...

  9. Aluminum: An Asynchronous, GPU-Aware Communication Library Optimized for Large-Scale Training of Deep Neural Networks on HPC Systems

    本文发表在MLHPC 2018上,主要介绍了一个名为Aluminum通信库,这个库针对Allreduce做了一些关于计算通信重叠以及针对延迟的优化,以加速分布式深度学习训练过程. 分布式训练的通信需求 ...

  10. JUC并发工具类之Semaphore控制并发线程数

    首先看看关于Semaphore的UML图: 从上图看,信号量的实现原理与锁类似,是基于AQS的:有公平与非公平之分.当初始的资源数为1时就退化为排它锁了,资源总数即state的初始值,在acquire ...