容器deque和vector的综合简单习题

h有5名选手:选手ABCDE, 10个评委分别对每一名选手打分, 去除最高分,去除评委中最低分,取平均分。
1.创建五名选手,放到vector中
2.遍历vector容器,取出来每一个选手, 执行for循环,可以把10个评分打分存到deque容器中
3. sort算法对deque容器中分数排序,pop_ back pop. front去除最高和最低分
4. deque容器遍历一遍,累加分数,累加分数/d.size()
5. person.score =平均分

1、定义一个Person类存放选手

class Person
{
public:
	string name;
	int score;
	Person() {};
	Person(string name,int score)
	{
		this->name = name;
		this->score = score;
	}
};
void text11()
{
	vector<Person>ob;
	//定义一个插入函数
	push(ob);
	//比赛
	much(ob);
	//输出数据
	peintob(ob);
}

2、//定义一个插入函数
    push(ob);

对于这个名字主要设计了是:"选手+A","选手+B","选手+C","选手+D","选手+E","选手+F"。每次取一个Name中的元素,根据string的模板函数可知取字符可用运算符重载了的[]或者成员函数at();对于"+="STL中也有重载,每次调用push_back()尾插函数插入,刚开始把得分都初始化为0,在much()函数中对其赋值。

void push(vector<Person>& ob)
{
	string Name = "ABCDE";
	int i = 0;
	for(i;i<5;i++)
	{
		string name = "选手";
		name += Name[i];
		ob.push_back(Person(0,name));
	}
}

3、//比赛
    much(ob);

对于随机种子理解:

rand()函数确实会给用户分配一个随机数,但是有弊端就是,这个随机数它不会变,主要原因还是随机种子确定后就没有再改变了,现在我们对随机种子srand(),对它传一个一直改变的参数,那么它产生的随机数就会一直改变了,我们肯定会想到时间函数,时间是一直改变了,就会导致随机种子一直改变,最终产生可变的随机数,时间函数time(NULL),头文件是#include<time.h>。

void much(vector<Person>& ob)
{
	srand(time(NULL));
	vector<Person>::iterator it = ob.begin();
	//建立deque容器,将评委打的分数放入
	deque<int>v;
	for (; it != ob.end(); it++)
	{
		int i = 0;
		for (i = 0; i < 10; i++)
		{
			//设置随机数,模拟评委打分
			v.push_back(rand()%41+60);
		}
		sort(v.begin(), v.end());
		//去掉最高分和最低分
		v.pop_back();
		v.pop_front();
		//accumulate带有三个形参:头两个形参指定要累加的元素范围,第三个形参则是累加的初值
		(*it).num = accumulate(v.begin(), v.end(),0)/v.size();
	}
}

4、//输出数据
    peintob(ob);

由于这个容器的数据是我们自定义类型,所以我们需要写一个输出函数或者重载函数运算符

void push(vector<Person>& ob)
{
	string Name = "ABCDE";
	int i = 0;
	for(i;i<5;i++)
	{
		string name = "选手";
		name += Name[i];
		ob.push_back(Person(0,name));
	}
}

下面附上完整代码:

#include <numeric>
#include<time.h>
class Person
{
public:
	int num;
	string name;
	Person(){}
	Person(int num,string name)
	{
		this->num = num;
		this->name = name;
	}
};
void push(vector<Person>& ob);
void peintob(vector<Person>& ob);
void much(vector<Person>& ob);
void text11()
{
	vector<Person>ob;
	//定义一个插入函数
	push(ob);
	//比赛
	much(ob);
	//输出数据
	peintob(ob);
}
void push(vector<Person>& ob)
{
	string Name = "ABCDE";
	int i = 0;
	for(i;i<5;i++)
	{
		string name = "选手";
		name += Name[i];
		ob.push_back(Person(0,name));
	}
}
void peintob(vector<Person>& ob)
{
	vector<Person>::iterator it = ob.begin();
	for (; it != ob.end(); it++)
	{
		cout << (*it).name << "  " << (*it).num << endl;
	}
}
void much(vector<Person>& ob)
{
	srand(time(NULL));
	vector<Person>::iterator it = ob.begin();
	//建立deque容器,将评委打的分数放入
	deque<int>v;
	for (; it != ob.end(); it++)
	{
		int i = 0;
		for (i = 0; i < 10; i++)
		{
			//设置随机数,模拟评委打分
			v.push_back(rand()%41+60);
		}
		sort(v.begin(), v.end());
		//去掉最高分和最低分
		v.pop_back();
		v.pop_front();
		//accumulate带有三个形参:头两个形参指定要累加的元素范围,第三个形参则是累加的初值
		(*it).num = accumulate(v.begin(), v.end(),0)/v.size();
	}
}
int main()
{
	text11();
	return 0;
}

以下就是最不重要的部分,那就是记录我的错误

写了几个小时代码,突然问了自己几个问题,都把自己问住了!!!!特别特别简单基础的问题

1、vector<Person>v;//这个v应该就算一个Person实例化的对象吧!!!EER
//    //v的类型是vector<Person>,是是实例好一个向量,这个向量里面放Person
//    //v是一个可以储存多个Person实例的容器实例

2、void insert(vector<Person>&v)
{

  string Name = "ABCD";
v.name = "考生";//那为啥不能用这个类的数据//因为v不是Person实例化的对象,它是一个实例化的容器
用来存放Person实例化的对象
(*v.begin()).name = "考生";//*v.begin()这是容器的起始迭代器,对其取*就是拿到它的内容,也就是它保存的Person实例化的对象
for (int i = 0; i < 5; i++)
    {
       n += Name[i];
   }
(*v.begin()).name = "考生";
   
 卡了好一会不能理解的问题,就是如果我这样写它起始的vacter是个空
也就是begin()==end();现在给元素赋值必然会出现错误--------(*v.begin()).name = "考生";

 

 

3、刚开始把int i=0;放在外for循环外面,然后就会导致它直接跳出赋值那一内循环,每次去掉最高分和最低分会从10个数变到8个到6个到4个到2个到0个;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值