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. DNS解析域名过程

    DNS解析域名过程 使用域名转换成IP地址,先读取本地HOST文件,本地文件没有从当前电信网管获取对应IP. 本地host文件 C:\Windows\System32\drivers\etc 画图演示 ...

  2. Linux小技巧scp命令

    Linux服务器运维小技巧scp命令详细教程. 前言 今天给大家带来的是linux中比较实用的命令scp.善用小技巧,解决工作中的痛点. 掌握一门好的技术或者说一门好的艺术,最快捷的方式就是融入到工作 ...

  3. Ubuntu 20.04.3 LTS + Intel Realsense 400系列

    Ubuntu 如何查看当前Ubuntu系统的版本,以及看自己的系统是否为LTS版本 lsb_release -a 如何查看Ubuntu系统的Linux系统版本,和GCC版本 cat /proc/ver ...

  4. VMware中Ubuntu18配置静态IP地址

    1. VMware:编辑 -> 虚拟网络编辑器 -> 更改设置 2. 取消选中:使用本地DHCP服务将IP地址分配给虚拟机,并记住子网ip 3. 点击NAT设置,记住网关地址 正常情况下V ...

  5. 03并发编程(多道技术+进程理论+进程join方法)

    目录 03 并发编程 03 并发编程

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

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

  7. Solution -「Code+#4」「洛谷 P4370」组合数问题 2

    \(\mathcal{Description}\)   Link.   给定 \(n,k\),求 \(0\le b\le a\le n\) 的 \(\binom{a}{b}\) 的前 \(k\) 大. ...

  8. WPF/MVVM Quick Start Tutorial - WPF/MVVM 快速入门教程 -原文,翻译及一点自己的补充

    转载自 https://www.codeproject.com/articles/165368/wpf-mvvm-quick-start-tutorial WPF/MVVM Quick Start T ...

  9. SIMD编码/解码

    在看SEAL库和HElib库中经常在编码中碰到打包(batch)技术,另外还提到了SIMD编码技术,有点困惑,编码.打包.SIMD到底有什么关系? 编码 在CKKS方案中,因为明文空间在复数域上,简单 ...

  10. vue如何获取thymeleaf渲染的input值?

    写项目时前端用了vue+模板引擎用了thymeleaf,然后有一个输入框取值问题让我很纠结,问题如下: <input class="count-num" type=" ...