//案例
//公司今天招聘了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
虽然结果来看差别不但,但是如果有用户后续需求要求 指定分组输出,我的代码改动量就要比老师大很多,所以这里是我考虑不全的地方。