deque的全称是double-ended queue,它支持从队列的两端进行插入和删除操作,因此可以看作是栈和队列的结合体。
deque双口容器、顺序存储、随机访问迭代器
头文件:#include<deque>
-
deque的遍历
void disp(deque<int> d)//遍历//正向迭代器,还有反向迭代器
{
deque<int>::iterator i = d.begin();
for (; i != d.end(); i++)
cout << *i << " ";
cout << endl;
}
-
deque的创建与初始化
几乎与vector相同
deque<int>d1;
deque<int>d2(2, 5); 5 5
int a[] = { 10,20,30 };
deque<int> d3(a,a+3); 10 20 30
deque<int> d4(d3.begin(), d3.end()); 10 20 30deque<int> d5(d4); 10 20 30
deque<int> d6 = d5; 10 20 30
//创建与初始化
void test1()
{
deque<int>d1;
deque<int>d2(2, 5);
int a[] = { 10,20,30 };
deque<int> d3(a,a+3);
deque<int> d4(d3.begin(), d3.end());
deque<int> d5(d4);
deque<int> d6 = d5;
}
-
deque的大小和读取数据
deque的大小指的就是元素个数,没有空间大小之说
初始d中有10 20 30
d.resize(6);//10 20 30 0 0 0
d.resize(6, 2);//10 20 30 2 2 2补2
读数据也与vector类似,都属于顺序bi
void test2()
{
int a[] = { 10,20,30 };
deque<int> d(a, a + 3);
//大小
cout << d.size();//元素个数
d.resize(6);//10 20 30 0 0 0
d.resize(6, 2);//10 20 30 2 2 2补2
//读取数据
cout << d[1];
cout << d.at(1);//读下标,因为是顺序表所以可以读
cout << d.front();
cout << d.back();
cout << *(d.begin() + 3);
}
deque的插入删除
插入函数:
d.push_front(5);//在开头插入
d.push_back(10);//在结尾插入d.insert(d.begin(), 2);//三个重载(位置,数值)
d.insert(d.end(), 2, 30);(位置,个数,数值)
d2.insert(d2.begin(), d.begin(), d.begin() + 4);(位置,一段的开头位置,一段的结尾位置)
删除函数:
d.pop_front();
d.pop_back();d.erase(d.begin(), d.end());
void test3()
{
deque<int> d;
//插入
d.push_front(5);
d.push_back(10);
d.push_back(20);
disp(d);
d.insert(d.begin(), 2);//三个重载(位置,数值)(位置,)
d.insert(d.end(), 2, 30);
deque<int>d2;
d2.insert(d2.begin(), d.begin(), d.begin() + 4);
//删除
d.pop_front();
d.pop_back();
d.erase(d.begin(), d.end());
}
deque与vector的区别
-
动态增长方式的不同
vector扩容会换地址
deque扩容不会换地址
void test4()
{
//vector
vector<int>v(2, 5);//5 5
int* p = &v[0];
cout << p << endl;
v.push_back(6);
v.push_back(7);
p = &v[0];
cout << p << endl;//地址不同
//deque
deque<int>d(2, 5);//5 5
p = &d[0];
cout << p << endl;
d.push_back(6);
d.push_back(7);
p = &d[0];//写不写无所谓,p不变
cout << p << endl;//地址相同
}
-
插入删除的不同
vector在中间删除一个数值时,后面的数值会向前补位
deque在中间删除一个数值后,选移动次数少的方向补位;次数相同时,后面的数值向前补位
//插入删除不同
void test5()
{
int a[] = { 10,20,30,40,50 };
//vector
vector<int> v(a, a + 5);
int* p = &v[3];//40
v.erase(v.begin() + 1);//30
cout << *p << endl;//50
//前面的往前移动
//deque(蛇形)
deque<int> d(a, a + 5);
p = &d[3];//40
d.erase(d.begin() + 1);//30
cout << *p << endl;//40
//10往后移动,选移动次数少的;次数相同,向前移
}
-
vector deque案例分析
#include<iostream>
#include<vector>
#include<algorithm>//算法
#include<deque>
using namespace std;
//四位选手,五位评委
//去掉最高分,最低分,取平均值,由大到小排序
class player
{
string name;
deque<double> score;//去最低最高,用deque更好
double ave;
public:
player(string n)
{
name = n;
ave = 0.0;
}
void fenshu()
{
cout << "给" << name << "打分:" << endl;
double s;
for (int i = 0; i < 5; i++)
{
cin >> s;
score.push_back(s);
}
}
void pinjun()
{
sort(score.begin(),score.end());//默认从小到大
score.pop_front();
score.pop_back();
double sum = 0;
deque<double>::iterator i = score.begin();
for (; i != score.end(); i++)
{
sum += *i;
}
ave = sum / score.size();
}
//重载<
//p1.operator<(p2)
bool operator<(player p)
{
return ave < p.ave;
}
void disp() {
cout << name << " " << ave << endl;
}
};
class Manage
{
vector<player> v;
public:
//录入选手信息
void add(player p)
{
v.push_back(p);
}
//打分
void dafen()
{
//遍历
vector<player>::iterator i = v.begin();
for (; i != v.end(); i++)
(*i).fenshu();
}
//求平均值
void average()
{
//遍历
vector<player>::iterator i = v.begin();
for (; i != v.end(); i++)
(*i).pinjun();
}
//排序
void paixu()
{
sort(v.begin(), v.end());//player型,重载p1<p2(平均分)
//p1<p2 p1.operator<(p2)
}
//显示
void show()
{
//反向遍历(从大到小)
vector<player>::reverse_iterator i = v.rbegin();
for (; i != v.rend(); i++)
(*i).disp() ;
}
};
int main()
{
player p1("huang"), p2("zi"), p3("hong"), p4("fan");
Manage m;
//录入选手信息
m.add(p1); m.add(p2); m.add(p3); m.add(p4);
//打分
m.dafen();
//求平均值
m.average();
//排序
m.paixu();
//显示
m.show();
return 0;
}