概念
- 双口容器,支持随机存取,可以在两端做插入和删除操作
- 没有容量概念,是动态的以分段的连续空间组合而成,随时可以增加一段新的空间并拼接起来,也因此deque没有必要做空间保留功能
- 指定位置的插入也会导致元素位置移动,效率低
deque构造函数
deque<T> deqT;
deque(beg,end);
deque(n,elem);
deque(const deque &deq);
deque赋值操作
assign(beg,end);
assign(n,elem);
deque& operator=(const deque &deq);
swap(deq);
deque大小操作
- deque的原理是分段连续的
- 内部需要一个中控器用于记录每一段连续空间的首地址
- 可以理解成是由多个vector组合而成
deque.size();
deque.empty();
deque.resize(num);
deque.resize(num,elem);
deque双端插入和删除操作
push_back(elem);
push_front(elem);
pop_back();
pop_front();
deque数据存取
at(idx)
operator[idx];
front();
back();
deque删除操作
clear();
erase(beg,end);
erase(pos);
代码和打分案例
#include<iostream>
#include <cstdlib>
#include <time.h>
#include<string>
#include<deque>
#include<vector>
#include<algorithm>
#include<Windows.h>
using namespace std;
void PrintDeque(deque<int> &de)
{
for (deque<int>::iterator it = de.begin(); it != de.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
void test01()
{
deque<int> d1;
deque<int> d2(10, 5);
deque<int> d3(d2.begin(), d2.end());
deque<int> d4(d3);
PrintDeque(d1);
PrintDeque(d2);
PrintDeque(d3);
PrintDeque(d4);
cout << "-----------" << endl;
}
void test02()
{
deque<int> d1;
deque<int> d2;
deque<int> d3;
d1.assign(10, 2);
d2.assign(d1.begin(), d1.end());
d3 = d2;
d1.swap(d2);
if (d1.empty())
{
cout << "空!" << endl;
}
else
{
cout << "不空!" << endl;
}
d1.resize(5);
PrintDeque(d1);
PrintDeque(d2);
PrintDeque(d3);
cout << "--------" << endl;
}
void test03()
{
deque<int> d1;
d1.push_back(100);
d1.push_front(200);
d1.push_back(300);
d1.push_back(400);
d1.push_front(500);
PrintDeque(d1);
int val = d1.front();
d1.pop_front();
d1.pop_back();
PrintDeque(d1);
}
class Player
{
public:
Player(string name, int score)
{
this->mName = name;
this->mScore = score;
}
public:
string mName;
int mScore;
};
void Create_Player(vector<Player> &vplay)
{
string nameSeed = "ABCDE";
for (int i = 0; i < 5; i++)
{
Player p("选手",0);
p.mName += nameSeed[i];
p.mScore = 0;
vplay.push_back(p);
}
}
void Set_Score(vector<Player>& vplay)
{
srand((unsigned int)time(NULL));
for (vector<Player>::iterator it = vplay.begin(); it != vplay.end(); it++)
{
deque<int> dScore;
for (int i = 0; i < 10; i++)
{
int score = rand() % 41 + 60;
dScore.push_back(score);
}
sort(dScore.begin(), dScore.end());
dScore.pop_back();
dScore.pop_front();
int sum = 0;
for (deque<int>::iterator dit=dScore.begin();dit!=dScore.end();dit++)
{
sum += *dit;
}
int avgsum = sum / dScore.size();
it->mScore = avgsum;
}
}
bool mycmpare(Player& p1, Player& p2)
{
return p1.mScore < p2.mScore;
}
void Print_Rank(vector<Player>& de)
{
sort(de.begin(), de.end(),mycmpare);
for (vector<Player>::iterator it = de.begin(); it != de.end(); it++)
{
cout << "姓名:" << it->mName << " " << "得分:" << it->mScore << endl;
}
cout << endl;
}
void test04()
{
vector<Player> vPlist;
Create_Player(vPlist);
Set_Score(vPlist);
Print_Rank(vPlist);
}
int main(void)
{
test04();
return 0;
}