复习 STL 遇到的一个案例,有需要的可以参考。代码如下:
//========================================== // Filename : STL -- 演讲比赛案例 // Time : 2019年5月22日 // Author : 柚子树 // Email : gz_duyong@163.com //========================================== #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> #include <ctime> #include <vector> #include <map> #include <deque> #include <numeric> #include <functional> #include <algorithm> using namespace std; struct Speaker { string Name; //姓名 int Score[3]; //得分 }; //创建选手 void CreateSpeaker(vector<int> &v, map<int, Speaker> &m) { string NameSeed = "ABCDEFGHIJKLMNOPQRSTUVWX"; for (size_t i = 0; i < NameSeed.size(); i++) { string name = "选手:"; name += NameSeed[i]; Speaker p; p.Name = name; for (size_t i = 0; i < 3; i++) { p.Score[i] = 0; } v.push_back(i + 100); m.insert(make_pair(i + 100, p)); } } //选手抽签 void SpeechDraw(vector<int> &v) { random_shuffle(v.begin(), v.end()); } //选手比赛 void SpeechContest(int index, vector<int> &v1, map<int, Speaker> &m, vector<int> &v2) { multimap<int, int, greater<int>> groupMap; //临时容器,存放比赛结果 int num = 0; for (vector<int>::iterator it = v1.begin(); it != v1.end(); it++) { num++; deque<int> d; for (size_t i = 0; i < 10; i++) { int score = rand() % 41 + 60; //分数区间 60 ~ 100 d.push_back(score); } //排序 sort(d.begin(), d.end()); //去除最高最低分 d.pop_back(); d.pop_front(); //累积分数 int sum = accumulate(d.begin(), d.end(), 0); int avg = sum / d.size(); //将平均分 放入到m容器中 m[*it].Score[index - 1] = avg; groupMap.insert(make_pair(avg, *it)); if (num % 6 == 0) { //取前三名 int count = 0; for (multimap<int, int, greater<int>>::iterator mit = groupMap.begin(); mit != groupMap.end(), count < 3; mit++, count++) { //晋级容器 获取获取数据 v2.push_back(mit->second); } groupMap.clear(); //清空临时容器 } } } //打印成绩 void ShowScore(int index, vector<int> &v, map<int, Speaker> &m) { cout << "第" << index << "轮 比赛成绩如下:" << endl; for (map<int, Speaker>::iterator it = m.begin(); it != m.end(); it++) { cout << "选手编号: " << it->first << " 姓名: " << it->second.Name << " 分数: " << it->second.Score[index - 1] << endl; } cout << "晋级选手编号" << endl; for (vector<int>::iterator it = v.begin(); it != v.end(); it++) { cout << *it << endl; } } int main() { srand((unsigned int)time(NULL)); vector<int> v1; //选手编号 map<int, Speaker> m; //存放选手编号和选手信息 CreateSpeaker(v1, m); SpeechDraw(v1); vector<int> v2; // 进入下一轮比赛的人员编号 SpeechContest(1, v1, m, v2); ShowScore(1, v2, m); // 轮数 晋级编号 具体人员信息 SpeechDraw(v2); vector<int> v3; SpeechContest(2, v2, m, v3); ShowScore(2, v3, m); SpeechDraw(v3); vector<int> v4; SpeechContest(3, v3, m, v4); ShowScore(3, v4, m); system("pause"); return EXIT_SUCCESS; }