deque容器

特性:

  • 双口容器
  • 支持随机访问
  • 没有容量概念,他是动态的的以分段的连续空间组合而成,随时可以增加一段新的空间并连接起来

在这里插入图片描述

[外链图片转存失败(img-b9DRi02Y-1565777640543)(E:\Typora\c++\1565777592174.png)]


deque常用API
构造函数
deque<T> deqT;	//默认构造形式
deque(begin, end);	//构造函数将[begin, end)区间的元素拷贝给自身
deque(n, elem);	//构造函数将n个elem拷贝给自身
deque(const deque &deq);	//拷贝构造函数

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

大小操作
deque.size();	//返回容器中元素的个数
deque.empty();	//判断容器是否为空
deque.resize(num);	//重新指定容器的长度为num,若容器变长,则以默认值值填充新位置,如果容器变短,则末尾超出容器长度的元素被删除
deque.resize(num, elem);	//重新指定容器的长度为num,若容器变长,则以elem值填充新位置,如果容器变短,则末尾超出容器长度的元素被删除

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

数据存取
at(idx);	//返回索引idx所指的数据,如果idx越界,抛出out_of_range
operator[];	//返回索引idx所指的数据,如果idx越界,不抛出异常,直接报错
front();	//返回第一个数据
back();		//返回最后一个数据

插入操作
insert(pos, elem);		//在pos位置插入一个elem元素的拷贝,返回新数据的位置
insert(pos, n, elem);	//在pos位置插入n个elem数据,无返回值
insert(pos, beg, end);	//在pos位置插入[beg, end)区间的数据,无返回值

删除操作
clear();	//删除容器所有数据
erase(beg, end);	//删除[beg, end)区间的数据,返回下一个数据的位置
erase(pos);	//删除pos位置的数据,返回下一数据的位置

deque容器打分案例
/*
  评委打分案例
  创建五个选手(姓名,分数),十个评委对他们进行打分
  得分规则:去除最高分,去除最低分,剩下的取平均分
  对五名选手的平均分进行排名
*/
#include<iostream>
#include<vector>
#include<deque>
#include<string>
#include <algorithm>
using namespace std;

//选手类
class Player
{
public:
	Player() {}
	Player(string name, int score) :m_Name(name), m_Score(score) {}
public:
	string m_Name;
	int m_Score;
};

//创建选手
void CreatePlayer(vector<Player>& v)
{
	string nameStr = "ABCDE";
	int len = nameStr.length();
	for (int i = 0; i < len; i++)
	{
		Player p;
		p.m_Name = "选手";
		p.m_Name += nameStr[i];
		p.m_Score = 0;

		v.push_back(p);		//将选手信息存入数组中
	}
}

//打分
void ScorePlayer(vector<Player>& v)
{
	vector<Player>::iterator itBegin = v.begin();
	vector<Player>::iterator itEnd = v.end();
	for (itBegin; itBegin != itEnd; itBegin++)
	{
		//当前学生打分
		deque<int> dScore;
		for (int i = 0; i < 10; i++)
		{
			int score = rand() % 41 + 60;
			dScore.push_back(score);
		}

		//排序,找出最大最小值并去除
		sort(dScore.begin(), dScore.end());	//sort()默认从小到大
		dScore.pop_front();
		dScore.pop_back();

		//求平均分
		int total=0;
		deque<int>::iterator ditBegin = dScore.begin();
		deque<int>::iterator ditEnd = dScore.end();
		for (ditBegin; ditBegin != ditEnd; ditBegin++)
		{
			total += *ditBegin;
		}
		(*itBegin).m_Score = total / dScore.size();
	}
}

//排名规则
bool RegularSort(Player& p1, Player& p2)
{
	return p1.m_Score > p2.m_Score;
}

//排名
void SortPlayer(vector<Player>& v)
{
	//从大到小排序
	sort(v.begin(), v.end(),RegularSort);
	//打印
	vector<Player>::iterator itBegin = v.begin();
	vector<Player>::iterator itEnd = v.end();
	for (itBegin; itBegin != itEnd; itBegin++)
	{
		cout << "姓名:" << (*itBegin).m_Name << 
			"  分数:" << (*itBegin).m_Score << endl;
	}
}

int main()
{
	//定义vector容器保存选手信息
	vector<Player> vPlist;

	CreatePlayer(vPlist);
	ScorePlayer(vPlist);
	SortPlayer(vPlist);

	return 0;
}
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐