#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <deque>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
class Player
{
public:
Player() {}
Player(string name) :name(name) {}
string &getName()
{
return name;
}
int &getScore()
{
return score;
}
private:
string name;
int score;
};
void createPlayer(vector<Player> &v)
{
string name = "ABCDE";
for (int i = 0; i < 5; i++)
{
Player p;
p.getName() = "选手:";
p.getName() += name[i];
//cout << p.getName() << endl;
p.getScore() = 0;
v.push_back(p);
}
}
void setScore(vector<Player> &v)
{
vector<Player>::iterator it = v.begin();
while (it != v.end())
{
deque<int> d;//使用这个容器来去掉一个player的最高分和最低分,并计算出平均分,赋值给player
for (int i = 0; i < 10; i++)
{
int score = rand() % 41 + 60;
d.push_back(score);
}
//对10次得分进行排序
sort(d.begin(), d.end());//排序算法,给的是区间,默认排序是从小到大
//去除最高分和最低分
d.pop_back();
d.pop_front();
//求平均分
int totalScore = 0;
for (int i = 0; i < d.size(); i++)
{
totalScore += d[i];
}
(*it).getScore() = totalScore / d.size();
it++;
}
}
//自己指定排序规则
bool myCompare(Player &p1, Player &p2)
{
return p1.getScore() > p2.getScore();
}
void printRank(vector<Player> &v)
{
//根据分数,给选手排序,默认是从小到大,你希望从大到小
sort(v.begin(), v.end(), myCompare);
//按照排名高低打印选手信息
vector<Player>::iterator it = v.begin();
while (it != v.end())
{
cout << (*it).getName() << "得分" << (*it).getScore() << endl;
it++;
}
}
//deque翻译为双端队列,两端都可以操作
int main()
{
//deque初始化
deque<int> d1;
deque<int> d2(10, 5);//这段代码的意思为创建10个元素,每个元素都为5
deque<int> d3(d2.begin(), d2.end());//区间赋值
deque<int> d4(d3);//拷贝构造
deque<int>::iterator it1 = d4.begin();
while (it1 != d4.end())
{
cout << *it1 << " ";
it1++;
}
cout << endl;
//赋值
//d1[0] = 1;//这是错误的,返回的不是引用,因此不能直接赋值,但可以做右值
//同理vector<int> v; v[0] = 1;也是不可以的
d1.assign(5, 2);//赋值5个元素,每个元素为2
d1 = d3;
//插入和删除
d1.push_back(100);
d1.push_front(200);
d1.pop_back();//删除数组最后一个元素
d1.pop_front();
//打分案例:
//总结:就是创建一个vector<Player>容器,装5个选手信息,再创建一个deque<int>容器,装一个选手得到的10次分数,并计算出平均值赋给vector容器里选手对象的score成员变量,最后对vector容器进行排序
//创建选手容器
vector<Player> v;
createPlayer(v);
setScore(v);
printRank(v);
return 0;
}