一、deque容器基本概念

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

deque和vector的最大差异?

一在于deque允许常数时间内对头端进行元素插入和删除操作。

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

特性总结:

  • 双端插入和删除元素效率较高。
  • 指定位置插入也会导致数据元素移动,降低效率。
  • 可随机存取,效率高。

二、deque常用API

1、deque构造函数

2、deque赋值操作

3、deque大小操作

4、deque双端插入和删除操作

4、deque数据存取

5、deque插入操作

三、案例

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <deque>
using namespace std; void PrintDeque(deque<int>& d)
{
for (deque<int>::iterator it = d.begin();it != d.end();it++)
{
cout << *it << " ";
}
cout << endl;
} //deque初始化
void test01()
{
deque<int> d1;
deque<int> d2(, );
deque<int> d3(d2.begin(), d2.end());
deque<int> d4(d3);//5 5 5 5 5 5 5 5 5 5 //打印d4
PrintDeque(d4);
} //赋值、大小操作
void test02()
{
deque<int> d1;
deque<int> d2;
deque<int> d3;
d1.assign(, );
d2.assign(d2.begin(), d2.end());//迭代器指定区间赋值
d3 = d2;//等号赋值
d1.swap(d2);//交换两个空间的元素 if (d1.empty())
{
cout << "空!" << endl;
}
else
{
cout << "size:" << d1.size() << endl;
} d1.resize();//d1本来有10个元素,后5个元素扔掉
} //deque容器插入和删除操作
void test03()
{
deque<int> d1;
d1.push_back();
d1.push_front();
d1.push_back();
d1.push_back();
d1.push_front(); PrintDeque(d1);//500 200 100 300 400 int val = d1.front();//拿到要删除的数据
d1.pop_front();//删除头元素,无返回值
val = d1.back();//拿到要删除的数据
d1.pop_back();//删除尾元素,无返回值 PrintDeque(d1);//200 100 300
} int main(void)
{
//test01();
//test02();
test03();
return ;
}
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <deque>
#include <vector>
#include <string>
#include <algorithm>
using namespace std; //评委打分案例(sort算法排序)
//创建5个选手(姓名,得分),10个评委给5个选手打分
//得分规则:去除最高分,去除最低分,取出平均分
//按得分对5名选手进行从大到小排名 //选手类
class Player
{
public:
Player(){}
Player(string name,int score):mName(name), mScore(score){}
public:
string mName;
int mScore;
}; //创建选手
void Create_Player(vector<Player>& v)
{
string nameSeed = "ABCDE";
for (int i = ;i < ;i++)
{
Player p;
p.mName = "选手";
p.mName += nameSeed[i];
p.mScore = ; v.push_back(p);
}
} void PrintScore(int val)
{
cout << val << " ";
} //打分
void Set_Score(vector<Player>& v)
{
for (vector<Player>::iterator it = v.begin();it != v.end();it++)
{
//当前学生进行打分
deque<int> dScore;
for (int i = ;i < ;i++)
{
int score = rand() % + ;
dScore.push_back(score);
} //对分数排序 默认从小到大
sort(dScore.begin(), dScore.end());
//for_each(dScore.begin(), dScore.end(), PrintScore);
//cout << endl; //去除最高分和最低分
dScore.pop_front();
dScore.pop_back(); //求平均分
int totalScore = ;
for (deque<int>::iterator dit = dScore.begin();dit!= dScore.end();dit++)
{
totalScore += (*dit);
} int avgScore = totalScore / dScore.size();
//保存分数
(*it).mScore = avgScore;
}
} //排序规则
bool mycompare(Player& p1, Player& p2)
{
return p1.mScore > p2.mScore;
}
//根据选手分数排名 sort默认从小到大,但我们希望从大到小
void Print_Rank(vector<Player>& v)
{
//排序
sort(v.begin(), v.end(), mycompare);
//打印
for (vector<Player>::iterator it = v.begin();it != v.end();it++)
{
cout << "姓名" << (*it).mName << "得分:" << (*it).mScore << endl;
}
}
int main(void)
{
//定义vector容器,保存选手信息
vector<Player> vPlist;
Create_Player(vPlist);
Set_Score(vPlist);
Print_Rank(vPlist); return ;
}

deque容器的更多相关文章

  1. STL学习三:deque容器

    1.Deque简介 deque是“double-ended queue”的缩写,和vector一样都是STL的容器,deque是双端数组,而vector是单端的. deque在接口上和vector非常 ...

  2. STL学习系列三:Deque容器

    1.Deque简介 deque是“double-ended queue”的缩写,和vector一样都是STL的容器,deque是双端数组,而vector是单端的. deque在接口上和vector非常 ...

  3. vector,list,deque容器的迭代器简单介绍

    我们知道标准库中的容器有vector,list和deque.另外还有slist,只不过它不是标准容器.而谈到容器,我们不得不知道进行容器一切操作的利器---迭代器.而在了解迭代器之前,我们得先知道每个 ...

  4. 带你深入理解STL之Deque容器

    在介绍STL的deque的容器之前,我们先来总结一下vector和list的优缺点.vector在内存中是分配一段连续的内存空间进行存储,其迭代器采用原生指针即可,因此其支持随机访问和存储,支持下标操 ...

  5. STL之Deque容器

    1.Deque容器 1)deque是“double-ended queue”的缩写,和vector一样都是STL的容器,deque是双端数组,而vector是单端的. 2)deque在接口上和vect ...

  6. STL Deque 容器

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

  7. C++——STL之vector, list, deque容器对比与常用函数

    STL 三种顺序容器的特性对比: vector 可变数组,内存空间是连续的,容量不会进行缩减.支持高效随机存取,即支持[]和at()操作.尾部插入删除效率高,其他位置插删效率较低: list 双向链表 ...

  8. c++ deque 容器

    deque (全名 double ended queue)是一种具有队列和栈一样的数据结构. 在c++标准库中几乎和vector容器的接口完全相同,但它和vector 还是有一些细微的差别. 1. d ...

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

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

随机推荐

  1. iOS git 托管代码 常用几个操作

    学习 git 切换分支 1  从远程下载一个分支develop(本地没有的) (1) git fetch origin develop (2) git checkout develop (默认 分支切 ...

  2. $Java设计模式之——观察者模式(Observer)

    (一)观察者模式简介 1.定义:定义对象间一种一对多的依赖关系,一个对象状态发生改变时,所有依赖它的对象都会接到通知并作出相应的响应. 2.应用场景: (1)GUI系统 (2)订阅-发布系统 (3)事 ...

  3. Linux软件包管理 RMP包

    RPM 包的安装虽然很方便和快捷,但是依赖性实在是很麻烦,尤其是库文件依赖,还要去 rpmfind 网站査找库文件到底属于哪个 RPM 包,从而导致 RPM 包的安装非常烦琐.那么,有没有可以自动解决 ...

  4. point-to-point(点对点) 网口

    点对点连接是两个系统或进程之间的专用通信链路.想象一下直接连接两个系统的一条线路.两个系统独占此线路进行通信.点对点通信的对立面是广播,在广播通信中,一个系统可以向多个系统传输. 点对点通信在OSI协 ...

  5. 【Head First Servlets and JSP】笔记18:JSP指令

    mark. jetbrain tomcat配置:https://www.jetbrains.com/help/idea/2017.1/creating-and-running-your-first-w ...

  6. CSS3动画表单

    在线演示 本地下载

  7. INSPIRED启示录 读书笔记 - 第3章 产品管理与项目管理

    互联网让两者变得不同 在传统的零售软件领域,产品经理常常兼任项目经理的工作,随着互联网的发展,两者的职责区别也越来越明显 产品管理的职责是探索(定义)有价值的.可用的.可行的产品 项目管理的职责是关注 ...

  8. L1范数与L2范数正则化

    2018-1-26 虽然我们不断追求更好的模型泛化力,但是因为未知数据无法预测,所以又期望模型可以充分利用训练数据,避免欠拟合.这就要求在增加模型复杂度.提高在可观测数据上的性能表现得同时,又需要兼顾 ...

  9. Kubernetes Rook

    Rook Rook 是一个开源的cloud-native storage编排, 提供平台和框架:为各种存储解决方案提供平台.框架和支持,以便与云原生环境本地集成. Rook 将存储软件转变为自我管理. ...

  10. mongodb count 导致不正确的数量(mongodb count 一个坑)

    在mongodb 集群中,if  存在orphaned documents 和chunk migration, count查询可能会导致一个不正确的查询结果,例如我就是踩的这个坑,先不说话,看结果: ...