博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
deque容器
阅读量:4502 次
发布时间:2019-06-08

本文共 3667 字,大约阅读时间需要 12 分钟。

一、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 
#include
using namespace std;void PrintDeque(deque
& d){ for (deque
::iterator it = d.begin();it != d.end();it++) { cout << *it << " "; } cout << endl;}//deque初始化void test01(){ deque
d1; deque
d2(10, 5); deque
d3(d2.begin(), d2.end()); deque
d4(d3);//5 5 5 5 5 5 5 5 5 5 //打印d4 PrintDeque(d4);}//赋值、大小操作void test02(){ deque
d1; deque
d2; deque
d3; d1.assign(10, 5); d2.assign(d2.begin(), d2.end());//迭代器指定区间赋值 d3 = d2;//等号赋值 d1.swap(d2);//交换两个空间的元素 if (d1.empty()) { cout << "空!" << endl; } else { cout << "size:" << d1.size() << endl; } d1.resize(5);//d1本来有10个元素,后5个元素扔掉}//deque容器插入和删除操作void test03(){ deque
d1; d1.push_back(100); d1.push_front(200); d1.push_back(300); d1.push_back(400); d1.push_front(500); 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 0;}

 

#define _CRT_SECURE_NO_WARNINGS#include 
#include
#include
#include
#include
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
& v){ string nameSeed = "ABCDE"; for (int i = 0;i < 5;i++) { Player p; p.mName = "选手"; p.mName += nameSeed[i]; p.mScore = 0; v.push_back(p); }}void PrintScore(int val){ cout << val << " ";}//打分void Set_Score(vector
& v){ for (vector
::iterator it = v.begin();it != v.end();it++) { //当前学生进行打分 deque
dScore; for (int i = 0;i < 10;i++) { int score = rand() % 41 + 60; 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 = 0; for (deque
::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
& v){ //排序 sort(v.begin(), v.end(), mycompare); //打印 for (vector
::iterator it = v.begin();it != v.end();it++) { cout << "姓名" << (*it).mName << "得分:" << (*it).mScore << endl; }}int main(void){ //定义vector容器,保存选手信息 vector
vPlist; Create_Player(vPlist); Set_Score(vPlist); Print_Rank(vPlist); return 0;}

 

转载于:https://www.cnblogs.com/yuehouse/p/10091228.html

你可能感兴趣的文章
WCF 定义SOAP和REST风格的webservice
查看>>
关于display
查看>>
图片懒加载
查看>>
tomcat下jndi的三种配置方式
查看>>
JS moveStart和moveEnd方法(TextRange对象--查找与选择)
查看>>
textArea中的placeholder属性不起作用
查看>>
Swift 里字符串(一)概览
查看>>
温故知新 javascript 正则表达式(转载)
查看>>
XP系统无法远程桌面
查看>>
正确使用索引
查看>>
java多态
查看>>
盒覆盖 算法
查看>>
bzoj1260 [CQOI2007]涂色paint
查看>>
仿网上银行虚拟键盘脚本- keyboard.js
查看>>
makefile "=" ":=" "?=" "+="
查看>>
机会是留给有准备的人
查看>>
实战是最好的学习方式
查看>>
使用qemu-img创建虚拟磁盘文件
查看>>
JDBC
查看>>
POJ - 3237 Tree (树链剖分+线段树)
查看>>