C++STL 容器案例 员工分组 实现步骤与代码分析与展示 实现步骤的注意事项

STL容器 员工分组案例

文章目录

  • STL容器 员工分组案例
    • 1 案例描述
    • 2 实现步骤
    • 3 案例代码与分析

1 案例描述

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

2 实现步骤

  1. 创建10名员工,放到vector中
  2. 遍历vector容器,取出每个员工,进行随机分组
  3. 分组后,将员工部门编号作为key,具体员工作为value,放入到multimap容器中
  4. 分部门显示员工信息

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);
}

注意以下几点:

  1. 员工分到不同的部门要放入multimap容器,是因为有可能一个部门有多个人,因此要创建multimap容器,其实这个相当于是部门容器了;
  2. multimap容器的元素是一个对组,因此一个int数据代表部门编号,另一个Worker数据代表具体的员工了;
  3. 在员工分组函数中,要传入的参数一个是员工容器,另一个就是部门容器,要用引用的方式传入实参,防止浅拷贝;
  4. 在员工分组函数中,首先遍历所有的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. 有可能有这种情况,1:A B C D G 2:E F J 3:H I
  2. 在分部门显示员工时,为了输出该部门信息,需要通过迭代器访问multimap中该部门信息。
  3. 例如,索引部门1时,可以直接通过key值和find函数索引到,find函数返回的是一个迭代器,因此要用一个multimap的迭代器来接收,即
multimap<int, Worker>::iterator pos = m.find(CEHUA);
pos = m.find(MEISHU);
pos = m.find(YANFA);
  1. 在输出当前部门1的员工时,如果只是for (; pos != m.end() ; pos++)来输出,就会不仅把部门1的员工输出,还会输出其他部门的员工信息。但实际想要的效果是,只输出部门1的这A B C D G五个人。
  2. 输出该部门时,只需要该部门的所有人即可, 因此要统计该部门有多少人。统计部门1的人数用到count函数,返回值是int类型。通过这个人数来控制循环结束的条件,即for (; pos != m.end() && index < num; pos++, index++)
  3. 为了保证每次运行都是真实的随机分配,加入随机种子srand((unsigned int)time(NULL));,利用系统提供时间做真实的随机,要包含头文件#include
  4. 以上设计的容器都要包含对应的头文件

最终效果
C++STL 容器案例 员工分组 实现步骤与代码分析与展示 实现步骤的注意事项_第1张图片

总结: 当数据以键值对形式存在,可以考虑用map 或 multimap

你可能感兴趣的:(C++,泛型编程,语法学习笔记,c++)