STL学习之十五:STL综合案例--演讲比赛

来源:互联网 发布:三国无双Mac版 编辑:程序博客网 时间:2024/05/16 15:53

本文主要以演讲比赛为例介绍STL综合性的案例。演讲比赛每一轮晋级一半人数,淘汰一半人数。具体的分析见代码中的注释部分。下面是具体的代码。

#include "iostream"using namespace std;#include "vector"#include "set"#include "queue"#include "list"#include "algorithm"#include "string"#include "functional"#include "iterator"#include "numeric"#include "map"#include "deque"class Speaker{public:string m_name;int m_score[3];protected:private:};int GenSpeaker(map<int,Speaker> &mapSpeaker,vector<int> &v){string str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";random_shuffle(str.begin(),str.end());for (int i=0;i<24;i++){Speaker tmp;tmp.m_name = "选手";tmp.m_score[0] = 0;tmp.m_score[1] = 0;tmp.m_score[2] = 0;tmp.m_name = tmp.m_name + str[i];mapSpeaker.insert(pair<int,Speaker>(100+i,tmp) );}for (int i=0;i<24;i++){v.push_back(100+i);}return 0;}//选手抽签 int speech_contest_draw(vector<int> &v){random_shuffle(v.begin(),v.end());return 0;}//选手比赛int speech_contest(int index,vector<int> &v1,map<int,Speaker> &mapSpeaker,vector<int> &v2){multimap<int,int,greater<int>> multimapGroup;//小组成绩int tmpCount = 0;for (vector<int>::iterator it=v1.begin();it!=v1.end();it++)//打分{tmpCount++;deque<int> dscore;for (int j=0;j<10;j++)//10个评委打分{int score = 50 + rand()%50;dscore.push_back(score);}sort(dscore.begin(),dscore.end());dscore.pop_back();dscore.pop_front();//去除最低分 和 最高分// 求平均分int scoresum = accumulate(dscore.begin(),dscore.end(),0);int scoreavg = scoresum/dscore.size();mapSpeaker[*it].m_score[index] = scoreavg;//选手得分 存入容器multimapGroup.insert(pair<int,int>(scoreavg,*it));// 处理分组if (tmpCount % 6 == 0){cout << "小组的比赛成绩:" << endl;for (multimap<int,int,greater<int>>::iterator mit=multimapGroup.begin();mit!=multimapGroup.end();mit++){//编号 姓名 得分cout << mit->second << "\t" << mapSpeaker[mit->second].m_name << "\t" << mit->first << endl;}// 前三名 晋级while(multimapGroup.size() > 3){multimap<int,int,greater<int>>::iterator it1 = multimapGroup.begin();v2.push_back(it1->second);// 把前三名编号 放到v2 晋级名单中multimapGroup.erase(it1);}multimapGroup.clear();// 清空本小组比赛成绩}}return 0;}//查看比赛结果int speech_contest_print(int index,vector<int> &v,map<int,Speaker> &mapSpeaker){cout << "第" <<index+1 << "轮晋级名单"<< endl;for (vector<int>::iterator it=v.begin();it!=v.end();it++){cout << "参数编号" << *it << "\t" << mapSpeaker[*it].m_name << "\t" << mapSpeaker[*it].m_score[index] << endl;}return 0;}void main(){map<int,Speaker>mapSpeaker;// 参加比赛的选手vector<int>v1;// 第一轮 演讲比赛名单vector<int>v2;// 第二轮 演讲比赛名单vector<int>v3;// 第三轮 演讲比赛名单vector<int>v4;// 第四轮 最后前三名 演讲比赛名单// 产生选手 得到第一轮选手的比赛名单GenSpeaker(mapSpeaker,v1);// 第一轮 选手抽签 选手比赛 查看比赛结果cout << "\n\n\n任意键开始第一轮比赛" << endl;cin.get();speech_contest_draw(v1);speech_contest(0,v1,mapSpeaker,v2);speech_contest_print(0,v2,mapSpeaker);// 第二轮 选手抽签 选手比赛 查看比赛结果cout << "\n\n\n任意键开始第二轮比赛" << endl;cin.get();speech_contest_draw(v2);speech_contest(1,v2,mapSpeaker,v3);speech_contest_print(1,v3,mapSpeaker);// 第三轮 选手抽签 选手比赛 查看比赛结果cout << "\n\n\n任意键开始决赛" << endl;cin.get();speech_contest_draw(v3);speech_contest(2,v3,mapSpeaker,v4);speech_contest_print(2,v4,mapSpeaker);cout << "hello..."<< endl;system("pause");}