STL容器 员工分组案例
文章目录
- STL容器 员工分组案例
- 1 案例描述
- 2 实现步骤
- 3 案例代码与分析
1 案例描述
- 公司今天招聘了10个员工(ABCDEFGHIJ),10名员工进入公司之后,需要指派员工在哪个部门工作
- 员工信息有: 姓名 工资组成;部门分为:策划、美术、研发
- 随机给10名员工分配部门和工资
- 通过multimap进行信息的插入 key(部门编号) value(员工)
- 分部门显示员工信息
2 实现步骤
- 创建10名员工,放到vector中
- 遍历vector容器,取出每个员工,进行随机分组
- 分组后,将员工部门编号作为key,具体员工作为value,放入到multimap容器中
- 分部门显示员工信息
3 案例代码与分析
步骤一:创建10名员工,放到vector中
//员工类
class Worker
{
public:
Worker(string name, int salary) :m_name(name), m_salary(salary) {}
string m_name;
int m_salary;
};
//创建员工并放入vector中
void createWorker(vector<Worker>& vw)//注意用引用的方式传递 防止浅拷贝
{
string nameseed = "ABCDEFGHIJ";
for (int i = 0; i < 10; i++)
{
string name = "员工";
name += nameseed[i];
int salary = rand() % 10001 + 15000;//10000-25000
Worker w(name, salary);
//员工放入vector容器中
vw.push_back(w);
}
}
int main()
{
//1、创建10名员工,放到vector中
vector<Worker> vworker;
createWorker(vworker);
//2、创建员工测试
cout << "员工分组前\n" << endl;
for (vector<Worker>::iterator it = vworker.begin(); it != vworker.end(); it++)
{
cout << "姓名:" << it->m_name << "\t工资:" << (*it).m_salary << endl;
}
cout << string(n, '-') << endl;
}
首先要创建员工类,类中包含姓名和工资信息,并且需要放进vector容器中。创建完之后,打印一下员工信息,看看是否能正常输出。
要注意的是,vector容器的元素类型是Person类,员工信息放进容器时用尾插法即可。
步骤二和三:遍历vector容器,随机分组,将员工部门编号作为key,具体员工作为value,放入到multimap容器中
//定义宏常量 代表1-3
#define CEHUA 1
#define MEISHU 2
#define YANFA 3
//分组后,将员工部门编号作为key,具体员工作为value,放入到multimap容器中
void groupWorker(vector<Worker>& vw, multimap<int, Worker>& mw)
{
//1. 遍历vector容器
for (vector<Worker>::iterator it = vw.begin(); it != vw.end(); it++)
{
//2. 随机产生部门编号 范围1-3
int deptId = rand() % 3 + 1;//定义宏常量 代表1-3
//3. 员工放进multimap中
mw.insert(make_pair(deptId, *it));//deptId 部门编号 *it具体员工
}
}
int main()
{
//1、创建10名员工,放到vector中
vector<Worker> vworker;
createWorker(vworker);
//2、创建员工测试
cout << "员工分组前\n" << endl;
for (vector<Worker>::iterator it = vworker.begin(); it != vworker.end(); it++)
{
cout << "姓名:" << it->m_name << "\t工资:" << (*it).m_salary << endl;
}
cout << string(n, '-') << endl;
//3、员工分组 员工在vector中 分组后放进multimap中
multimap<int, Worker> mworker;
groupWorker(vworker, mworker);
}
注意以下几点:
- 员工分到不同的部门要放入multimap容器,是因为有可能一个部门有多个人,因此要创建multimap容器,其实这个相当于是部门容器了;
- multimap容器的元素是一个对组,因此一个int数据代表部门编号,另一个Worker数据代表具体的员工了;
- 在员工分组函数中,要传入的参数一个是员工容器,另一个就是部门容器,要用引用的方式传入实参,防止浅拷贝;
- 在员工分组函数中,首先遍历所有的vector中的员工,再随机产生1、2、3个数字,代表策划、美术、研发部门编号,最后通过multimap的insert函数按照部门编号来放入员工信息。为了更直观,可以定义三个宏常量来代替这三个部门编号。
步骤四:分部门显示员工信息
//员工分组显示
void showWorkerbyGroup(multimap<int, Worker>& m)
{
int n = 40;
cout << "策划部门" << endl;
multimap<int, Worker>::iterator pos = m.find(CEHUA);//找到策划部门 并返回这个部门的迭代器
int num = m.count(CEHUA);//统计该部门有多少人
int index = 0;
for (; pos != m.end() && index < num; pos++, index++)
{
cout << "姓名:" << pos->second.m_name << "\t工资:" << pos->second.m_salary << endl;
}
cout << string(n, '-') << endl;
cout << "美术部门" << endl;
pos = m.find(MEISHU);//找到策划部门 并返回这个部门的迭代器
num = m.count(MEISHU);//统计该部门有多少人
index = 0;
for (; pos != m.end() && index < num; pos++, index++)
{
cout << "姓名:" << pos->second.m_name << "\t工资:" << pos->second.m_salary << endl;
}
cout << string(n, '-') << endl;
cout << "研发部门" << endl;
pos = m.find(YANFA);//找到策划部门 并返回这个部门的迭代器
num = m.count(YANFA);//统计该部门有多少人
index = 0;
for (; pos != m.end() && index < num; pos++, index++)
{
cout << "姓名:" << pos->second.m_name << "\t工资:" << pos->second.m_salary << endl;
}
}
int main()
{
int n = 40;
srand((unsigned int)time(NULL));//利用系统提供时间做真实的随机
//1、创建10名员工,放到vector中
vector<Worker> vworker;
createWorker(vworker);
//1、测试
cout << "员工分组前\n" << endl;
for (vector<Worker>::iterator it = vworker.begin(); it != vworker.end(); it++)
{
cout << "姓名:" << it->m_name << "\t工资:" << (*it).m_salary << endl;
}
cout << string(n, '-') << endl;
//2、员工分组 员工在vector中 分组后放进multimap中
multimap<int, Worker> mworker;
groupWorker(vworker, mworker);
//3、员工分组
cout << "\n员工分组后\n" << endl;
showWorkerbyGroup(mworker);
cout << string(n, '-') << endl;
system("pause");
return 0;
}
注意以下几点:
- 有可能有这种情况,1:A B C D G 2:E F J 3:H I
- 在分部门显示员工时,为了输出该部门信息,需要通过迭代器访问multimap中该部门信息。
- 例如,索引部门1时,可以直接通过key值和find函数索引到,find函数返回的是一个迭代器,因此要用一个multimap的迭代器来接收,即
multimap<int, Worker>::iterator pos = m.find(CEHUA);
pos = m.find(MEISHU);
pos = m.find(YANFA);
- 在输出当前部门1的员工时,如果只是
for (; pos != m.end() ; pos++)
来输出,就会不仅把部门1的员工输出,还会输出其他部门的员工信息。但实际想要的效果是,只输出部门1的这A B C D G五个人。 - 输出该部门时,只需要该部门的所有人即可, 因此要统计该部门有多少人。统计部门1的人数用到count函数,返回值是int类型。通过这个人数来控制循环结束的条件,即
for (; pos != m.end() && index < num; pos++, index++)
- 为了保证每次运行都是真实的随机分配,加入随机种子
srand((unsigned int)time(NULL));
,利用系统提供时间做真实的随机,要包含头文件#include <ctime>
- 以上设计的容器都要包含对应的头文件
最终效果
总结: 当数据以键值对形式存在,可以考虑用map 或 multimap