码迷,mamicode.com
首页 > 编程语言 > 详细

C++提高5 STL算法 :查找,统计,排序,拷贝,替换,算术,集合 |STL 案例:学校演讲比赛介绍

时间:2016-07-21 06:34:35      阅读:603      评论:0      收藏:0      [点我收藏+]

标签:拷贝   替换   统计   排序   c++提高5 stl算法 :查找   


【本文谢绝转载】

<大纲>


STL
	算法
		查找算法
			adjacent_find()查找容器中重复元素的首地址
			distance()根据迭代器,返回元素的下标
			binary_search()二分查找:在有序的序列
			find   查找函数
			find_if 自定义查找函数
		统计算法
			count 返回容器中相同元素的个数
			cout_if 统计大于3的元素个数
		排序算法
			marge()对两个有序容器组合到另一个容器
			sort 自定义排序
			random_shuffle 随机洗牌 基本数据类型
			random_shuffle 随机洗牌 非基本数据类型
			reverse逆序string:
			reverse基本数据类型的逆序
		拷贝算法:
			容器1元素拷贝到容器2
		替换算法:
			replace()把元素为3 全部替换成8
			replace_if()把大于等于5的全部换成8
			swap容器交换
		算术运算:
			accumylate 对指定范围内的元素求和,然后结果再加上一个由value的初始值
			fill  将输入值赋值给标志范围内的所有元素
		集合算法:
			set_union联合 并集操作

STL案例:
	学校演讲比赛介绍
		需求分析
		实现思路
		参考程序



STL 算法

查找算法

adjacent_find()查找容器中重复元素的首地址

distance()根据迭代器,返回元素的下标

chunli@http://990487026.blog.51cto.com~/c++$ cat stl_04.cpp 
#include <iostream>
#include <string.h>
using namespace std;
#include <string> 
#include <vector> 
#include <list> 
#include <set>  
#include <algorithm> 
#include <functional>
#include <iterator>

int main()
{
        vector<int> v1; 
        v1.push_back(1);
        v1.push_back(3);
        v1.push_back(3);
        v1.push_back(5);
	vector<int>::iterator it = adjacent_find(v1.begin(),v1.end());	//查找容器中重复元素的位置
	if(it == v1.end())
	{
		cout << "没有重复的元素\n";
	}
	else
	{
		cout << "找到重复的元素 " << *it << endl;
		int index = distance(v1.begin(),it);
		cout << "元素下标的位置是 " << index << endl;
	}
	


        return 0;
}


chunli@http://990487026.blog.51cto.com~/c++$ g++  -g -o run stl_04.cpp && ./run 
找到重复的元素 3
元素下标的位置是 1
chunli@http://990487026.blog.51cto.com~/c++$



binary_search()二分查找:在有序的序列

chunli@http://990487026.blog.51cto.com~/c++$ cat stl_04.cpp 
#include <iostream>
#include <string.h>
using namespace std;
#include <string> 
#include <vector> 
#include <list> 
#include <set> 
#include <algorithm> 
#include <functional>
#include <iterator>

int main()
{
        vector<int> v1; 
        v1.push_back(1);
        v1.push_back(3);
        v1.push_back(5);
        v1.push_back(6);
        v1.push_back(7);
        v1.push_back(8);
        v1.push_back(9);
	bool b = binary_search(v1.begin(),v1.end(),7);
	if(b == false)
	{
		cout << "没找到\n";
	}
	else
	{
		cout << "找到了\n";
	}
        return 0;
}


chunli@http://990487026.blog.51cto.com~/c++$ g++  -g -o run stl_04.cpp && ./run 
找到了
chunli@http://990487026.blog.51cto.com~/c++$





统计算法



count 返回容器中相同元素的个数

chunli@http://990487026.blog.51cto.com~/c++$ cat stl_04.cpp 
#include <iostream>
#include <string.h>
using namespace std;
#include <string> 
#include <vector> 
#include <list> 
#include <set> 
#include <algorithm> 
#include <functional>
#include <iterator>

int main()
{
        vector<int> v1; 
        v1.push_back(1);
        v1.push_back(3);
        v1.push_back(7);
        v1.push_back(6);
        v1.push_back(7);
	int n  = count(v1.begin(),v1.end(),7);
	cout << n << endl;
        return 0;
}


chunli@http://990487026.blog.51cto.com~/c++$ g++  -g -o run stl_04.cpp && ./run 
2
chunli@http://990487026.blog.51cto.com~/c++$




cout_if 统计大于3的元素个数

chunli@http://990487026.blog.51cto.com~/c++$ cat stl_04.cpp 
#include <iostream>
#include <string.h>
using namespace std;
#include <string> 
#include <vector> 
#include <list> 
#include <set> 
#include <algorithm> 
#include <functional>
#include <iterator>

bool myfun(int i)
{
	if(i > 3)
	{
		return true;
	}
	else
	{
		return false;
	}
}

int main()
{
        vector<int> v1; 
        v1.push_back(1);
        v1.push_back(3);
        v1.push_back(7);
        v1.push_back(6);
        v1.push_back(7);
	int n  = count_if(v1.begin(),v1.end(),myfun);
	cout << n << endl;
        return 0;
}


chunli@http://990487026.blog.51cto.com~/c++$ g++  -g -o run stl_04.cpp && ./run 
3
chunli@http://990487026.blog.51cto.com~/c++$


find,find_if 自定义查找函数

chunli@http://990487026.blog.51cto.com~/c++$ cat stl_04.cpp 
#include <iostream>
#include <string.h>
using namespace std;
#include <string> 
#include <vector> 
#include <list> 
#include <set> 
#include <algorithm> 
#include <functional>
#include <iterator>

bool myfun(int i)
{
	if(i > 3)
	{
		return true;
	}
	else
	{
		return false;
	}
}

int main()
{
        vector<int> v1; 
        v1.push_back(1);
        v1.push_back(3);
        v1.push_back(666);
        v1.push_back(6);
        v1.push_back(9);
	vector<int>::iterator it = find(v1.begin(),v1.end(),3);	//查找等于3的元素
	if(it != v1.end())
	{
		cout << *it << endl;
	}
	else
	{
		cout << "not find! \n";
	}

	vector<int>::iterator it2 = find_if(v1.begin(),v1.end(),myfun);	//返回容器中第一个比3大的元素
	if(it2 != v1.end())
	{
		cout << *it2 << endl;
	}
	else
	{
		cout << "not find! \n";
	}

        return 0;
}


chunli@http://990487026.blog.51cto.com~/c++$ g++  -g -o run stl_04.cpp && ./run 
3
666
chunli@http://990487026.blog.51cto.com~/c++$



排序算法

marge()对两个有序容器组合到另一个容器

chunli@http://990487026.blog.51cto.com~/c++$ cat stl_04.cpp 
#include <iostream>
#include <string.h>
using namespace std;
#include <string> 
#include <vector> 
#include <list> 
#include <set> 
#include <algorithm> 
#include <functional>
#include <iterator>

int main()
{
        vector<int> v1; 
        v1.push_back(1);
        v1.push_back(3);
        v1.push_back(5);
        v1.push_back(7);
        v1.push_back(9);

        vector<int> v2; 
        v2.push_back(2);
        v2.push_back(4);
        v2.push_back(6);
        v2.push_back(8);
        v2.push_back(10);
	
        vector<int> v3; 
	v3.resize(v1.size() + v2.size());
	merge(v1.begin(),v1.end(),v2.begin(),v2.end(),v3.begin());
	
	for(vector<int>::iterator it = v3.begin();it != v3.end();it++)
	{
		cout << *it << " " ;
	}
	cout << endl;

        return 0;
}


chunli@http://990487026.blog.51cto.com~/c++$ g++  -g -o run stl_04.cpp && ./run 
1 2 3 4 5 6 7 8 9 10 
chunli@http://990487026.blog.51cto.com~/c++$


sort 自定义排序

chunli@http://990487026.blog.51cto.com~/c++$ cat stl_04.cpp 
#include <iostream>
#include <string.h>
using namespace std;
#include <string> 
#include <vector> 
#include <list> 
#include <set> 
#include <algorithm> 
#include <functional>
#include <iterator>
#include<numeric>


class Student
{
public:
	Student(string name,int id)
	{
		m_name = name;
		m_id = id;
	}
	string m_name;
	int m_id;
};

//GCC 必须带上const
bool CompareS(const Student &s1,const Student &s2)
{
	return(s1.m_id < s2.m_id);
}
int main()
{
	Student s1("老大",44);
	Student s2("老二",33);
	Student s3("老三",22);
	Student s4("老四",11);
	vector<Student> v1;
	v1.push_back(s4);
	v1.push_back(s1);
	v1.push_back(s3);
	v1.push_back(s2);
	cout << "排序前\n";
	for(vector<Student>::iterator it = v1.begin();it != v1.end();it++)	
	{
		cout << it->m_id << " "<< it->m_name << "\n";
	}
	sort(v1.begin(),v1.end(),CompareS);
	cout << "\n排序后\n";
	for(vector<Student>::iterator it = v1.begin();it != v1.end();it++)	
	{
		cout << it->m_id << " "<< it->m_name << "\n";
	}



	return 0;
}


chunli@http://990487026.blog.51cto.com~/c++$ g++  -g -o run stl_04.cpp && ./run 
排序前
11 老四
44 老大
22 老三
33 老二

排序后
11 老四
22 老三
33 老二
44 老大
chunli@http://990487026.blog.51cto.com~/c++$


random_shuffle 随机洗牌 基本数据类型

chunli@http://990487026.blog.51cto.com~/c++$ cat stl_05.cpp 
#include <iostream>
#include <string.h>
using namespace std;
#include <string> 
#include <vector> 
#include <list> 
#include <set> 
#include <algorithm> 
#include <functional>
#include <iterator>
#include<numeric>

int main()
{
	vector<int> v1;
	v1.push_back(1);
	v1.push_back(2);
	v1.push_back(3);
	v1.push_back(4);
	v1.push_back(5);
	v1.push_back(6);
	v1.push_back(7);
	v1.push_back(8);
	cout << "洗牌之前 \n";
	for(vector<int>::iterator it = v1.begin();it != v1.end();it++)	
	{
		cout << *it << " ";
	}
	cout << "\n\n洗牌之后 \n";
	random_shuffle(v1.begin(),v1.end());
	for(vector<int>::iterator it = v1.begin();it != v1.end();it++)	
	{
		cout << *it << " ";
	}
	cout << endl;



	return 0;
}
chunli@http://990487026.blog.51cto.com~/c++$ g++  -g -o run stl_05.cpp && ./run 
洗牌之前 
1 2 3 4 5 6 7 8 

洗牌之后 
5 4 8 7 1 6 3 2 
chunli@http://990487026.blog.51cto.com~/c++$



random_shuffle 随机洗牌 非基本数据类型

chunli@http://990487026.blog.51cto.com~/c++$ cat stl_05.cpp 
#include <iostream>
#include <string.h>
using namespace std;
#include <string> 
#include <vector> 
#include <list> 
#include <set> 
#include <algorithm> 
#include <functional>
#include <iterator>
#include<numeric>

int main()
{
	string s1 = "abcdefg";
	cout << s1 << endl;
	random_shuffle(s1.begin(),s1.end());
	cout << s1 << endl;


	return 0;
}
chunli@http://990487026.blog.51cto.com~/c++$ g++  -g -o run stl_05.cpp && ./run 
abcdefg
edbgafc
chunli@http://990487026.blog.51cto.com~/c++$


reverse逆序:

chunli@http://990487026.blog.51cto.com~/c++$ cat stl_05.cpp 
#include <iostream>
#include <string.h>
using namespace std;
#include <string> 
#include <vector> 
#include <list> 
#include <set> 
#include <algorithm> 
#include <functional>
#include <iterator>
#include<numeric>

int main()
{
	string s1 = "abcdefg";
	cout << s1 << endl;
	reverse(s1.begin(),s1.end());
	cout << s1 << endl;


	return 0;
}
chunli@http://990487026.blog.51cto.com~/c++$ g++  -g -o run stl_05.cpp && ./run 
abcdefg
gfedcba
chunli@http://990487026.blog.51cto.com~/c++$


reverse基本数据类型的逆序

chunli@http://990487026.blog.51cto.com~/c++$ cat stl_06.cpp 
#include <iostream>
#include <string.h>
using namespace std;
#include <string> 
#include <vector> 
#include <list> 
#include <set> 
#include <algorithm> 
#include <functional>
#include <iterator>
#include<numeric>

int main()
{
	vector<int> v1;
	v1.push_back(1);
	v1.push_back(2);
	v1.push_back(3);
	v1.push_back(4);
	v1.push_back(5);
	v1.push_back(6);
	v1.push_back(7);
	v1.push_back(8);
	cout << "洗牌之前 \n";
	for(vector<int>::iterator it = v1.begin();it != v1.end();it++)	
	{
		cout << *it << " ";
	}
	cout << "\n\n洗牌之后 \n";
	reverse(v1.begin(),v1.end());
	for(vector<int>::iterator it = v1.begin();it != v1.end();it++)	
	{
		cout << *it << " ";
	}
	cout << endl;



	return 0;
}
chunli@http://990487026.blog.51cto.com~/c++$ g++  -g -o run stl_06.cpp && ./run 
洗牌之前 
1 2 3 4 5 6 7 8 

洗牌之后 
8 7 6 5 4 3 2 1 
chunli@http://990487026.blog.51cto.com~/c++$



拷贝算法:容器1元素拷贝到容器2

chunli@http://990487026.blog.51cto.com~/c++$ cat stl_06.cpp 
#include <iostream>
#include <string.h>
using namespace std;
#include <string> 
#include <vector> 
#include <list> 
#include <set> 
#include <algorithm> 
#include <functional>
#include <iterator>
#include<numeric>

int main()
{
	vector<int> v1;
	v1.push_back(1);
	v1.push_back(2);
	v1.push_back(3);
	v1.push_back(4);
	v1.push_back(5);
	v1.push_back(6);
	v1.push_back(7);
	v1.push_back(8);
	
	vector<int> v2;
	v2.resize(v1.size() );
	copy(v1.begin(),v1.end(),v2.begin());
	for(vector<int>::iterator it = v2.begin();it != v2.end();it++)	
	{
		cout << *it << " ";
	}
	cout << endl;



	return 0;
}
chunli@http://990487026.blog.51cto.com~/c++$ g++  -g -o run stl_06.cpp && ./run 
1 2 3 4 5 6 7 8 
chunli@http://990487026.blog.51cto.com~/c++$


replace()替换算法:把元素为3 全部替换成8

chunli@http://990487026.blog.51cto.com~/c++$ cat stl_06.cpp 
#include <iostream>
#include <string.h>
using namespace std;
#include <string> 
#include <vector> 
#include <list> 
#include <set> 
#include <algorithm> 
#include <functional>
#include <iterator>
#include<numeric>

int main()
{
	vector<int> v1;
	v1.push_back(1);
	v1.push_back(2);
	v1.push_back(3);
	v1.push_back(4);
	v1.push_back(5);
	v1.push_back(3);
	v1.push_back(7);
	v1.push_back(8);
	
	replace(v1.begin(),v1.end(),3,8);
	for(vector<int>::iterator it = v1.begin();it != v1.end();it++)	
	{
		cout << *it << " ";
	}
	cout << endl;



	return 0;
}
chunli@http://990487026.blog.51cto.com~/c++$ g++  -g -o run stl_06.cpp && ./run 
1 2 8 4 5 8 7 8 
chunli@http://990487026.blog.51cto.com~/c++$




replace_if()把大于等于5的全部换成8

chunli@http://990487026.blog.51cto.com~/c++$ cat stl_06.cpp 
#include <iostream>
#include <string.h>
using namespace std;
#include <string> 
#include <vector> 
#include <list> 
#include <set> 
#include <algorithm> 
#include <functional>
#include <iterator>
#include<numeric>

bool myfun(int n)
{
	return (n >= 5);
}
int main()
{
	vector<int> v1;
	v1.push_back(1);
	v1.push_back(2);
	v1.push_back(3);
	v1.push_back(4);
	v1.push_back(5);
	v1.push_back(3);
	v1.push_back(7);
	v1.push_back(8);
	
	replace(v1.begin(),v1.end(),3,8);
	for(vector<int>::iterator it = v1.begin();it != v1.end();it++)	
	{
		cout << *it << " ";
	}
	cout << endl;

	replace_if(v1.begin(),v1.end(),myfun,8);
	for(vector<int>::iterator it = v1.begin();it != v1.end();it++)	
	{
		cout << *it << " ";
	}
	cout << endl;




	return 0;
}
chunli@http://990487026.blog.51cto.com~/c++$ g++  -g -o run stl_06.cpp && ./run 
1 2 8 4 5 8 7 8 
1 2 8 4 8 8 8 8 
chunli@http://990487026.blog.51cto.com~/c++$



swap容器交换

chunli@http://990487026.blog.51cto.com~/c++$ cat stl_06.cpp 
#include <iostream>
#include <string.h>
using namespace std;
#include <string> 
#include <vector> 
#include <list> 
#include <set> 
#include <algorithm> 
#include <functional>
#include <iterator>
#include<numeric>
void ptint(vector<int> &v1)
{
        for(vector<int>::iterator it = v1.begin();it != v1.end();it++)
        {
                cout << *it << " ";
        }
        cout << endl;

}

int main()
{
	vector<int> v1;
	v1.push_back(1);
	v1.push_back(2);
	v1.push_back(3);
	
	vector<int> v2;
	v2.push_back(2);
	v2.push_back(4);
	v2.push_back(6);
	ptint(v1);
	ptint(v2);
	cout << "\n交换\n";
	swap(v1,v2);
	ptint(v1);
	ptint(v2);


	return 0;
}
chunli@http://990487026.blog.51cto.com~/c++$ g++  -g -o run stl_06.cpp && ./run 
1 2 3 
2 4 6 

交换
2 4 6 
1 2 3 
chunli@http://990487026.blog.51cto.com~/c++$



算术运算


accumylate 对指定范围内的元素求和,然后结果再加上一个由value的初始值

chunli@http://990487026.blog.51cto.com~/c++$ cat stl_06.cpp 
#include <iostream>
#include <string.h>
using namespace std;
#include <string> 
#include <vector> 
#include <list> 
#include <set> 
#include <algorithm> 
#include <functional>
#include <iterator>
#include<numeric>
int main()
{
	vector<int> v1;
	v1.push_back(1);
	v1.push_back(2);
	v1.push_back(3);
	int sum = accumulate(v1.begin(),v1.end(),100);
	cout << sum << endl;
	return 0;
}
chunli@http://990487026.blog.51cto.com~/c++$ g++  -g -o run stl_06.cpp && ./run 
106
chunli@http://990487026.blog.51cto.com~/c++$



fill  将输入值赋值给标志范围内的所有元素

chunli@http://990487026.blog.51cto.com~/c++$ !cat 
cat stl_06.cpp  
#include <iostream>
#include <string.h>
using namespace std;
#include <string> 
#include <vector> 
#include <list> 
#include <set> 
#include <algorithm> 
#include <functional>
#include <iterator>
#include<numeric>
void print(vector<int> &v1)
{
        for(vector<int>::iterator it = v1.begin();it != v1.end();it++)
        {
                cout << *it << " ";
        }
        cout << endl;

}

int main()
{
	vector<int> v1;
	v1.push_back(1);
	v1.push_back(2);
	v1.push_back(3);
	fill(v1.begin(),v1.end(),100);
	print(v1);
	return 0;
}
chunli@http://990487026.blog.51cto.com~/c++$ g++  -g -o run stl_06.cpp && ./run 
100 100 100 
chunli@http://990487026.blog.51cto.com~/c++$



集合操作,set_union联合

chunli@http://990487026.blog.51cto.com~/c++$ cat stl_06.cpp 
#include <iostream>
#include <string.h>
using namespace std;
#include <string> 
#include <vector> 
#include <list> 
#include <set> 
#include <algorithm> 
#include <functional>
#include <iterator>
#include<numeric>
void print(vector<int> &v1)
{
        for(vector<int>::iterator it = v1.begin();it != v1.end();it++)
        {
                cout << *it << " ";
        }
        cout << endl;
}

int main()
{
	vector<int> v1;
	v1.push_back(1);
	v1.push_back(6);
	v1.push_back(3);

	vector<int> v2;
	v2.push_back(4);
	v2.push_back(5);
	v2.push_back(2);
	vector<int> v3;
	v3.resize(v1.size() + v2.size() );
	set_union(v1.begin(),v1.end(),v2.begin(),v2.end(),v3.begin() );
	print(v3);
	return 0;
}
chunli@http://990487026.blog.51cto.com~/c++$ g++  -g -o run stl_06.cpp && ./run 
1 4 5 2 6 3 
chunli@http://990487026.blog.51cto.com~/c++$







STL案例:


学校演讲比赛介绍


1)某市举行一场演讲比赛( speech_contest ),共有24个人参加。比赛共三轮,前两轮为淘汰赛,第三轮为决赛。


2)比赛方式:分组比赛,每组6个人;选手每次要随机分组,进行比赛;


第一轮分为4个小组,每组6个人。比如100-105为一组,106-111为第二组,依次类推,

每人分别按照抽签(draw)顺序演讲。当小组演讲完后,淘汰组内排名最后的三个选手,然后继续下一个小组的比赛。

  第二轮分为2个小组,每组6人。比赛完毕,淘汰组内排名最后的三个选手,然后继续下一个小组的比赛。

第三轮只剩下6个人,本轮为决赛,选出前三名。

4)比赛评分:10个评委打分,去除最低、最高分,求平均分

每个选手演讲完由10个评委分别打分。该选手的最终得分是去掉一个最高分和一个最低分,求得剩下的8个成绩的平均分。

选手的名次按得分降序排列,若得分一样,按参赛号升序排名。


用STL编程,求解这个问题

1) 请打印出所有选手的名字与参赛号,并以参赛号的升序排列。

2) 打印每一轮比赛后,小组比赛成绩和小组晋级名单

3) 打印决赛前三名,选手名称、成绩。


需求分析:

产生选手 ( ABCDEFGHIJKLMNOPQRSTUVWXYZ ) 姓名、得分;选手编号

第1轮 选手抽签 选手比赛 查看比赛结果 

第2轮 选手抽签 选手比赛 查看比赛结果

第3轮 选手抽签 选手比赛 查看比赛结果



实现思路

需要把选手信息、选手得分信息、选手比赛抽签信息、选手的晋级信息保存在容器中,需要涉及到各个容器的选型。(相当于信息的数据库E-R图设计)

选手可以设计一个类Speaker(姓名和得分)

所有选手编号和选手信息,可以放在容器内:map<int, Speaker> 

所有选手的编号信息,可以放在容器:vecter<int> v1中

第1轮晋级名单,可以放在容器vecter<int> v2中 

第2轮晋级名单,可以放在容器vecter<int> v3中

第3轮前三名名单,可以放在容器vecter<int> v4中


每个小组的比赛得分信息,按照从小到大的顺序放在 

multimap<成绩, 编号, greater<int>>  multmapGroup    

也就是:multimap<int, int, greater<int> > multmapGroup;


参考程序

chunli@http://990487026.blog.51cto.com~/c++$ cat main.cpp 
//STL常用算法

#include <iostream>
#include <string.h>
using namespace std;
#include <string> 
#include <vector> 
#include <deque> 
#include <list> 
#include <map> 
#include <set> 
#include <algorithm> 
#include <functional> 
#include <numeric>	 
#include <time.h>

class Speaker
{
public:
	string m_name;
	int m_score[3];
};

//生成选手,参加比赛的名单
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_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 speaker_contest_draw(vector<int> &v)
{
	random_shuffle(v.begin(),v.end());
}
//选手比赛
int speaker_contest(int index,vector<int>&v1,map<int,Speaker> &mapSpeaker,vector<int> &v2)
{
	srand((unsigned int)time(NULL));	//随机数种子
	//小组比赛得分,记录下来
	multimap<int,int,greater<int> > multmpGroup;//选手分数编号,从小到大排序
	//为每个选手模拟打分
	int count = 0;
	int team_num = 0;
	for(vector<int>::iterator it = v1.begin();it != v1.end();it++)
	{
		count ++;
		deque<int> dscore ;	//用来接收10个评委的分数
		for(int j = 0;j<10;j++)	//10个评委
		{
			int score  =  rand() %100;//模拟打分
			dscore.push_back(score);
		}
		sort(dscore.begin(),dscore.end());
		dscore.pop_front();	//去除最高分 最低分
		dscore.pop_back();
		int score_sum = accumulate(dscore.begin(),dscore.end(),0);
		int score_avg = score_sum/dscore.size(); //计算平均分
		//把分数计入第x位选手的第y轮的score记录中
		mapSpeaker[*it].m_score[index] = score_avg;
		//按照分数,编号存储
		multmpGroup.insert(pair<int ,int> (score_avg,*it) );
		if(count % 6 == 0)	//如果能被6整除,就是一个小组
		{
			team_num ++;
			cout << "第"<< index+1 << "轮第" << team_num<<"小组的6位选手比赛成绩\n";
			cout << "编号\t姓名\t得分\n";
			for(multimap<int,int,greater<int> >:: iterator mit = multmpGroup.begin(); mit != multmpGroup.end();mit ++)
			{	
				//编号,姓名,得分
				cout << mit->second  << "\t" << mapSpeaker[mit->second].m_name << "\t" << mit->first<< endl;
			}
			//把前三名放到v2 晋级名单中
			while(multmpGroup.size() > 3)
			{
				multimap<int,int,greater<int> >:: iterator it1 = multmpGroup.begin();
				v2.push_back(it1->second);
				multmpGroup.erase(it1);			
			}
			multmpGroup.clear();	//清除本小组的 比赛成绩
		}
	}

	return 0;
}

int speech_contest_prinrt(int index,vector<int> &v,map<int,Speaker> &mapSpeaker)
{
	cout << "\n第"<<index + 1<<"轮晋级名单\n";;
	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;
		
	}
	cout << "------------------------------------\n";
	return 0;
}
int main()
{
	map<int,Speaker> mapSpeaker;	
	vector<int> v1;	//第1轮选手名单
	vector<int> v2;	//第2轮选手名单
	vector<int> v3;	//第3轮选手名单
	vector<int> v4;	//获奖名单
	
	GenSpeaker(mapSpeaker,v1);	////生成选手,参加比赛的名单

	//第1轮选手抽签,比赛,查看成绩
	speaker_contest_draw(v1);		//选手抽签
	speaker_contest(0,v1,mapSpeaker,v2);	//开始比赛
	speech_contest_prinrt(0,v2,mapSpeaker);

	//第2轮选手抽签,比赛,查看成绩
	speaker_contest_draw(v2);	//选手抽签
	speaker_contest(1,v2,mapSpeaker,v3);
	speech_contest_prinrt(1,v3,mapSpeaker);

	//第3轮选手抽签,比赛,查看成绩
	speaker_contest_draw(v3);	//选手抽签
	speaker_contest(2,v3,mapSpeaker,v4);
	speech_contest_prinrt(2,v4,mapSpeaker);

	return 0;
}
chunli@http://990487026.blog.51cto.com~/c++$ g++  -g -o run main.cpp && ./run 
第1轮第1小组的6位选手比赛成绩
编号	姓名	得分
118	选手N	60
114	选手A	59
102	选手L	53
106	选手R	52
107	选手B	50
113	选手C	43
第1轮第2小组的6位选手比赛成绩
编号	姓名	得分
103	选手P	72
117	选手S	60
100	选手E	46
110	选手D	46
115	选手X	46
109	选手J	43
第1轮第3小组的6位选手比赛成绩
编号	姓名	得分
108	选手G	62
104	选手Y	57
101	选手K	56
112	选手T	48
111	选手W	42
105	选手Q	38
第1轮第4小组的6位选手比赛成绩
编号	姓名	得分
119	选手I	62
123	选手M	52
121	选手V	52
122	选手H	52
120	选手F	42
116	选手Z	40

第1轮晋级名单
参赛编号:118	选手N	60
参赛编号:114	选手A	59
参赛编号:102	选手L	53
参赛编号:103	选手P	72
参赛编号:117	选手S	60
参赛编号:100	选手E	46
参赛编号:108	选手G	62
参赛编号:104	选手Y	57
参赛编号:101	选手K	56
参赛编号:119	选手I	62
参赛编号:123	选手M	52
参赛编号:121	选手V	52
------------------------------------
第2轮第1小组的6位选手比赛成绩
编号	姓名	得分
102	选手L	60
103	选手P	59
101	选手K	53
117	选手S	52
119	选手I	50
114	选手A	43
第2轮第2小组的6位选手比赛成绩
编号	姓名	得分
121	选手V	72
108	选手G	60
118	选手N	46
104	选手Y	46
100	选手E	46
123	选手M	43

第2轮晋级名单
参赛编号:102	选手L	60
参赛编号:103	选手P	59
参赛编号:101	选手K	53
参赛编号:121	选手V	72
参赛编号:108	选手G	60
参赛编号:118	选手N	46
------------------------------------
第3轮第1小组的6位选手比赛成绩
编号	姓名	得分
101	选手K	60
102	选手L	59
103	选手P	53
118	选手N	52
108	选手G	50
121	选手V	43

第3轮晋级名单
参赛编号:101	选手K	60
参赛编号:102	选手L	59
参赛编号:103	选手P	53
------------------------------------
chunli@http://990487026.blog.51cto.com~/c++$






本文出自 “魂斗罗” 博客,请务必保留此出处http://990487026.blog.51cto.com/10133282/1828218

C++提高5 STL算法 :查找,统计,排序,拷贝,替换,算术,集合 |STL 案例:学校演讲比赛介绍

标签:拷贝   替换   统计   排序   c++提高5 stl算法 :查找   

原文地址:http://990487026.blog.51cto.com/10133282/1828218

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!