C++STL通用容器----->deque

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;
}
  1. 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 30

    deque<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;
}

 

  1. 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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

狒狒998

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值