C++基本知识--STL基础--案例2

//案例
//公司今天招聘了10个员工(ABCDEFGHIJ),10名员工进入公司之后,要指派员工在那个部门工作
//员工信息又:姓名,工资组成,部门分为 策划,美术,研发
//随机给10名员工分配部门和工资
//通过multimap进行信息的录入,key(部门编号) value(员工)
//分部门显示员工信息


//实现步骤
//创建10名员工,插入到vector中
//遍历10名员工,取出每个员工,进行随机分组
//分组后,讲员工部门编号作为key值,具体员工作为value,放入multimap中
//分部门显示员工信息

1.我的代码

string departname[3]={"策划","美术","研发"};
string cname[10]={"A","B","C","D","E","F","G","H","I","J"};

class person
{
public:
	person(string name,int salary,int depart)
	{
		this->m_name = name;
		this->m_salary = salary;
		this->m_depart = depart;
	}
	
	string getname()
	{
		return m_name;
	}
	int getsalary()
	{
		return m_salary;
	}
	int getdepart()
	{
		return m_depart;
	}

private:
	string m_name;
	int m_salary;
	int m_depart;
};

void test01()
{
	//创建随机因子;
	srand((unsigned)time(NULL));
	
	//插入vector
	vector<person> vp;
	for(int i=0;i<10;i++)
	{
		int salary = random()%4000;
		int depart = random()%3;
		person p(cname[i],salary,depart);
		vp.push_back(p);
	}

	//test
/*	for(vector<person>::iterator it = vp.begin();it != vp.end();it++)
	{
		cout << it->getname() << " "<<it->getsalary() << " "<<it->getdepart()<<endl;
	}
*/
	//key(部门编号) value(员工)放入multimap
	multimap<int,person> mp;
	for(vector<person>::iterator it = vp.begin();it != vp.end();it++)
	{
		mp.insert(make_pair(it->getdepart(),*it));	
	}

	//分部门显示
	int lastdepart = -1;
	for(multimap<int,person>::iterator mit = mp.begin(); mit != mp.end(); mit++)
	{
		if(lastdepart != mit->first)
		{
			cout <<"depart: "<<departname[mit->first]<<endl;
			lastdepart = mit->first;
		}
		cout << "name: "<<mit->second.getname()<< " "<<"salary: "<< mit->second.getsalary() << endl;
	}
	cout << endl;
}

2 老师的代码

//老师的做法
//1.对不同的过程进行了封装,也就是对不同的行为进行了封装
//比如创建员工提取了出来进行封装
//同时老师创建的类,是把属性放在了public
//老师的员工类中没有部门属性

class worker
{
public:
	string m_name;
	int m_salary;
};

void creatework(vector<worker>& wk)
{
	string nameSeed="ABCDEFGHIJ"; //这里和我的string定义不同,我是一个个,他直接一串接着[]取值
	for(int i=0;i<10;i++)
	{
		worker work;
		work.m_name="员工";
		work.m_name += nameSeed[i]; //c++的string operator += 可以直接拼接
		work.m_salary = rand()%10000+10000;// 10000~19999;

		//将员工放入vector
		wk.push_back(work);
	}	
}

void setGroup(vector<worker>& wk,multimap<int,worker>&mp)
{
	for(vector<worker>::iterator it = wk.begin();it != wk.end();it++)
	{
		//产生随机部门编号
		int depid = rand()%3;
		
		//将员工插入到分组中
		mp.insert(make_pair(depid,*it));	
	}

		
}
#define CHEHUA 0
#define MEISHU 1
#define YANFA 2
void showGroup(multimap<int,worker>&mp)
{
	cout <<"策划:"<<endl;
	multimap<int,worker>::iterator it = mp.find(CHEHUA);
	int count = mp.count(CHEHUA);
	int index=0;
	for(; it != mp.end() && index < count;it++,index++)
	{
		cout << "name: "<<it->second.m_name<< " "<<"salary: "<< it->second.m_salary << endl;
	}
	cout << endl;	

	cout <<"美术:"<<endl;
	multimap<int,worker>::iterator mit = mp.find(MEISHU);
	int mcount = mp.count(MEISHU);
	int mindex=0;
	for(; mit != mp.end() && mindex < mcount;mit++,mindex++)
	{
		cout << "name: "<<mit->second.m_name<< " "<<"salary: "<< mit->second.m_salary << endl;
	}
	cout << endl;	

	cout <<"研发:"<<endl;
	multimap<int,worker>::iterator yit = mp.find(YANFA);
	int ycount = mp.count(YANFA);
	int yindex=0;
	for(; yit != mp.end() && yindex < ycount;yit++,yindex++)
	{
		cout << "name: "<<yit->second.m_name<< " "<<"salary: "<< yit->second.m_salary << endl;
	}
	cout << endl;	
}

void test02()
{
	vector<worker> wk;
	
	//创建员工
	creatework(wk);
	//test
	for(vector<worker>::iterator it = wk.begin();it != wk.end();it++)
	{
		cout << it->m_name << " "<<it->m_salary <<endl;
	}

	
	//员工分组
	multimap<int,worker>mp;
	setGroup(wk,mp);

	//显示员工
	showGroup(mp);

}

3 比较

不同点:

1.老师对员工类属性定义中没有部门的定义,为了方便测试,把属性定义为了public

2.老师对各种行为进行了封装;

3.老师对分组输出采用的是指定分组输出,而我使用的是遍历输出

        老师的分组输出更加具备可操作性,可扩展性

4 老师对string 的定义 是通过 一串字符串,通过[]获得不同位的字符,和我定义的结果一样,但是是不是老师的这个定义更加节省内存空间?不懂

4 两种方法下的执行结果

我的执行结果

depart: 策划
name: G salary: 1222
name: I salary: 1448
depart: 美术
name: A salary: 1112
name: H salary: 3478
depart: 研发
name: B salary: 20
name: C salary: 2644
name: D salary: 3274
name: E salary: 3833
name: F salary: 3051
name: J salary: 3530

老师的执行结果:

策划:
name: 员工D salary: 10704

美术:
name: 员工E salary: 15794
name: 员工G salary: 17212
name: 员工H salary: 14905
name: 员工I salary: 16657
name: 员工J salary: 11089

研发:
name: 员工A salary: 17646
name: 员工B salary: 16801
name: 员工C salary: 16929
name: 员工F salary: 14753

虽然结果来看差别不但,但是如果有用户后续需求要求 指定分组输出,我的代码改动量就要比老师大很多,所以这里是我考虑不全的地方。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值