2.4 C++STL deque容器详解
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容器详解的更多相关文章
- C++ STL bitset 容器详解
C++ STL bitset 容器详解 本篇随笔讲解\(C++STL\)中\(bitset\)容器的用法及常见使用技巧. \(bitset\)容器概论 \(bitset\)容器其实就是个\(01\)串 ...
- [转]STL之deque容器详解
Deque 容器 deque容器是C++标准模版库(STL,Standard Template Library)中的部分内容.deque容器类与vector类似,支持随机访问和快速插入删除,它在容器中 ...
- 2.3 C++STL vector容器详解
文章目录 2.3.1 引入 2.3.2 代码实例 2.3.3 运行结果 总结 2.3.1 引入 vector 容器 动态数组 可变数组 vector容器 单口容器(尾部操作效率高) vector动态增 ...
- 2.7 C++STL list容器详解
文章目录 2.7.1 引入 2.7.2代码示例 2.7.3代码运行结果 总结 2.7.1 引入 STL list 容器,又称双向链表容器,即该容器的底层是以双向链表的形式实现的.这意味着,list 容 ...
- [C++ STL] deque使用详解
一.deque介绍: deque(双端队列)是一个动态数组,可以向两端发展,因此不论在尾部或头部安插元素都十分迅速. 在中间部分安插元素则比较费时,因为必须移动其它元素. 二.用法 1.头文件 #in ...
- 【转载】[C++ STL] deque使用详解
转载自 https://www.cnblogs.com/linuxAndMcu/p/10260124.html 一.概述 deque(双端队列)是由一段一段的定量连续空间构成,可以向两端发展,因此不论 ...
- 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. ...
- STL Deque 容器
STL Deque 容器 Deque简介 deque是“double-ended queue”的缩写,和vector一样都是STL的容器,deque是双 端的,而vector是单端的. ...
- STL bind1st bind2nd详解
STL bind1st bind2nd详解 先不要被吓到,其实这两个配接器很简单.首先,他们都在头文件<functional>中定义.其次,bind就是绑定的意思,而1st就代表fir ...
随机推荐
- VC 获取多个mac地址
转载请注明来源:https://www.cnblogs.com/hookjc/ #include <IPHlpApi.h>#include <iostream>#pragma ...
- 配置phpmemcache扩展,Loaded Configuration File (none)
首先我来描述问题: 编译安装完php的扩展库memcache后,在php.ini文件中添加了memcache.so的配置文件 extension=/usr/local/php5.6.27/lib/ph ...
- 有关 iOS 的开发证书、应用标识、设备标识、配置文件以及密钥 #DF
iOS开发过程中如果需要进行真机调试.发布需要注册申请很多证书, 以下是对iOS开发的常用证书和密钥等的逐一简单说明: 证书 iOS常用的证书包括开发证书和发布证书,无论是真机调试还是最终发布应用到A ...
- MySQL 日志管理及备份与恢复
MySQL 日志管理及备份与恢复 1.日志管理 2.备份与恢复 1.日志管理: MySQL的默认日志保存位置为/usr/local/mysql/data 日志开启方式有两种:通过配置文件或者是通过命令 ...
- 纯JS脚本发送HTTP请求
1 var xmlHttp; 2 var iii = 0; 3 if (window.XMLHttpRequest) { 4 xmlHttp = new XMLHttpRequest(); 5 if ...
- docker平时使用异常记录
GPU主机重启后,启动使用GPU的容器报错 docker: Error response from daemon: Unknown runtime specified nvidia. 解决办法:修改/ ...
- java_web开发中 遇到可坑
目前有两个坑,: 一 首先在启动tomcat的时候 我进行的一个跳转页面的操作然后报了如下的错误: org.apache.jasper.JasperException: /jsp/frame.jsp ...
- Java执行cmd命令、bat脚本、linux命令,shell脚本等
1.Windows下执行cmd命令 如复制 D:\tmp\my.txt 到D:\tmp\my_by_only_cmd.txt 现文件如图示: 执行代码: private static void run ...
- MybatisPlus二级缓存
一.序言 本文承接[Mybatis缓存体系探究],提供基于MybatisPlus技术可用于生产环境下的二级缓存解决方案. 1.前置条件 掌握MyBatis二级缓存的原理 有关MyBatis缓存原理内容 ...
- Solution -「洛谷 P5827」边双连通图计数
\(\mathcal{Description}\) link. 求包含 \(n\) 个点的边双连通图的个数. \(n\le10^5\). \(\mathcal{Solution}\) ...