deque容器

概念

  • 双口容器,支持随机存取,可以在两端做插入和删除操作
  • 没有容量概念,是动态的以分段的连续空间组合而成,随时可以增加一段新的空间并拼接起来,也因此deque没有必要做空间保留功能
  • 指定位置的插入也会导致元素位置移动,效率低

deque构造函数

deque<T> deqT;//默认构造形式
deque(beg,end);//构造函数将[beg,end]区间的元素拷贝过来给本身
deque(n,elem);//构造函数将n个elem拷贝给本身
deque(const deque &deq);//拷贝构造函数

deque赋值操作

assign(beg,end);//将[beg,end]区间中的数据拷贝赋值给本身
assign(n,elem);//将n个elem拷贝赋值给本身
deque& operator=(const deque &deq);//重载等号操作符
swap(deq);//将deq与本身的元素互换

deque大小操作

  • deque的原理是分段连续的
  • 内部需要一个中控器用于记录每一段连续空间的首地址
  • 可以理解成是由多个vector组合而成
deque.size();//返回容器中元素的个数
deque.empty();//判断容器是否为空
deque.resize(num);//重新指定容器长度为num,若容器变长,则以默认值填充位置,若容器变短,则末尾超出部分元素被删除
deque.resize(num,elem);//重新指定容器长度为num,若容器变长,则以elem填充位置,若容器变短,则末尾超出部分元素被删除

deque双端插入和删除操作

push_back(elem);//在容器尾部添加一个数据
push_front(elem);//在容器头部插入一个数据
pop_back();//删除容器最后一个数据
pop_front();//删除容器第一个数据

deque数据存取

at(idx)//返回索引idx的数据,若超出范围会抛出异常
operator[idx];//返回索引处idx的值,若idx御姐不抛出异常
front();//返回第一个数据
back();//返回最后一个数据

deque删除操作

clear();//移除容器的所有数据
erase(beg,end);//删除[beg,end]区间的数据,返回下一个数据的位置
erase(pos);//删除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);//10个元素,后5个扔掉

	PrintDeque(d1);
	PrintDeque(d2);
	PrintDeque(d3);
	cout << "--------" << endl;
}

//deque容器插入和删除
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);
}

/*
* 评委打分案例
* 创建5个选手姓名和得分,10个评委对其打分
* 得分规则,去掉一个最高分去掉一个最低分,取出平均分
* 按得分对5个选手进行排名
*/
//选手类
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 = "选手:";
		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++)
	{
		//unsigned sk = time(0);
		//srand(time(0));
		
		//对当前学生进行打分
		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容器,保存选手信息
	vector<Player> vPlist;
	Create_Player(vPlist);
	Set_Score(vPlist);
	Print_Rank(vPlist);
}

int main(void)
{
	//test01();
	//test02();
	//test03();
	test04();
	return 0;
}
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页