vector是单向开口的连续性空间,deque是双向开口的连续性空间
deque与vector 的最大差异:
一在于deque允许常数时间内对头端元素插入和删除操作
二在于deque没有容量的概念,因为它是动态的以分段的连续空间组合而成,随时可以增加一段新的空间并连接起来,换句话说,向vertor那样"因旧空间不足而重新分配一段更大的空间,然后再复制元素,释放空间“这样的操作不会发生在deque身上,也因此deque没有必要提供所谓的空间保留功能
特性:
1.双端插入和删除效率较高
2.指定位置插入也会导致数据元素移动,降低效率
3.随机存取,效率高
deque构造函数
void test1()
{
deque<int> d1;
deque<int> d2(10,5);//用10个5初始化
deque<int>d3(d2.begin(), d2.end());
deque<int>d4(d3);//拷贝构造
for (deque<int>::iterator it = d4.begin(); it != d4.end(); it++)
{
cout << *it << " ";//放入的啥取出的就是啥
}
cout << endl;
}
deque赋值操作
deque大小操作
//赋值 大小
void test2()
{
deque<int> d;//初始化
d.assign(10,5);//10个5
deque<int> d2;
d2.assign(d.begin(), d.end());//迭代器指定区间赋值
deque<int> d3;
d3 = d2;//等号赋值
d.swap(d2);//交换两个空间的元素
if (d.empty())
{
cout << "kong" << endl;
}
else
{
cout << "不空" << endl;
}
d.resize(5);//只保留前5个元素
}
deque双端插入和删除操作
void test3()
{
deque<int> d1;
d1.push_back(100);
d1.push_back(200);
d1.push_back(300);
printDeque(d1);
//d1.pop_front();//删除元素 没有返回值 不知道删除的对不对
int val = d1.front();//先拿到要删除的元素
d1.pop_front();//再删除元素
val = d1.back();
d1.pop_back();
}
案例
// deque.cpp: 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<iostream>
#include<string>
#include<deque>
#include<vector>
#include<algorithm>
using namespace std;
//评委打分案例(sort 算法排序)
//创建5个选手(姓名 得分) 10个评委对5个评委打分
//得分规则 去除最高分 去除最低分 取出平局分
//按得分对5名选手排名
//
class Player
{
public:
int score;
string name;
Player()
{
}
Player( string name,int score)
{
this->name = name;
this->score = score;
}
};
//创建选手
void Create_player(vector<Player>& v)
{
string nameSeed = "ABCDE";
for (int i = 0; i < 5; i++)
{
Player p;
p.name = "选手";
p.name += nameSeed[i];
p.score = 0;
v.push_back(p);
}
}
void printscore(int v)
{
cout << v << " ";
}
//打分
void set_score(vector<Player>& v)
{
for (vector<Player>::iterator it = v.begin(); it != v.end(); it++)
{
//当前学生进行打分
deque<int>Dscore;
for (int j = 0; j < 10; j++)
{
int score = rand() % 40 + 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<int>::iterator it1 = Dscore.begin(); it1 != Dscore.end(); it1++)
{
totalscore += *it1;
}
int avgScore = totalscore / Dscore.size();
//保存分数
(*it).score = avgScore;
}
}
bool compareScore(Player p1,Player p2)
{
return p1.score > p2.score;
}
//根据分数进行排名 sort从小到大 我们希望从大到小
void Print_Rank(vector<Player>& v)
{//sort不知道对象应该怎么排序
sort(v.begin(), v.end(),compareScore);
for (vector<Player>::iterator it = v.begin(); it != v.end(); it++)
{
cout <<"姓名"<< (*it).name <<"得分"<<(*it).score<< endl;
}
}
int main()
{
//定义vector容器 保存选手信息
vector<Player> vPlist;
Create_player(vPlist);
set_score(vPlist);
Print_Rank(vPlist);
return 0;
}