C++STL 容器案例 员工分组 实现步骤与代码分析与展示 实现步骤的注意事项
创始人
2025-05-28 12:03:48

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& vw)//注意用引用的方式传递 防止浅拷贝
{string nameseed = "ABCDEFGHIJ";for (int i = 0; i < 10; i++){string name = "员工";name += nameseed[i];int salary = rand() % 10001 + 15000;//10000-25000Worker w(name, salary);//员工放入vector容器中vw.push_back(w);}
}int main()
{//1、创建10名员工,放到vector中vector vworker;createWorker(vworker);//2、创建员工测试cout << "员工分组前\n" << endl;for (vector::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& vw, multimap& mw)
{//1. 遍历vector容器for (vector::iterator it = vw.begin(); it != vw.end(); it++){//2. 随机产生部门编号 范围1-3int deptId = rand() % 3 + 1;//定义宏常量 代表1-3//3. 员工放进multimap中 mw.insert(make_pair(deptId, *it));//deptId 部门编号 *it具体员工}
}int main()
{//1、创建10名员工,放到vector中vector vworker;createWorker(vworker);//2、创建员工测试cout << "员工分组前\n" << endl;for (vector::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 mworker;groupWorker(vworker, mworker);
}

注意以下几点:

  1. 员工分到不同的部门要放入multimap容器,是因为有可能一个部门有多个人,因此要创建multimap容器,其实这个相当于是部门容器了;
  2. multimap容器的元素是一个对组,因此一个int数据代表部门编号,另一个Worker数据代表具体的员工了;
  3. 在员工分组函数中,要传入的参数一个是员工容器,另一个就是部门容器,要用引用的方式传入实参,防止浅拷贝;
  4. 在员工分组函数中,首先遍历所有的vector中的员工,再随机产生1、2、3个数字,代表策划、美术、研发部门编号,最后通过multimap的insert函数按照部门编号来放入员工信息。为了更直观,可以定义三个宏常量来代替这三个部门编号。

步骤四:分部门显示员工信息

//员工分组显示
void showWorkerbyGroup(multimap& m)
{int n = 40;cout << "策划部门" << endl;multimap::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 vworker;createWorker(vworker);//1、测试cout << "员工分组前\n" << endl;for (vector::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 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::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. 以上设计的容器都要包含对应的头文件

最终效果
在这里插入图片描述

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

相关内容

热门资讯

有屠人货肉归阅读答案【最新】   文言文《狼》两则故事,回答问题。  (一)  一屠晚归,担中肉尽,止有剩骨。途中两狼,缀行甚远。...
小学语文课外阅读指导方法的研... 小学语文课外阅读指导方法的研究小学语文课外阅读指导方法的研究结题报告  昌乐育才双语学校 刘金婷  ...
结婚对联 结婚对联  在平时的学习、工作或生活中,大家都听说过或者使用过一些比较经典的对联吧,对联是一种对偶文...
猜谜语及脑筋急转弯   导语:谜语主要指暗射事物或文字等供人猜测的隐语,也可引申为蕴含奥秘的事物。下面是小编整理的猜谜语...
哈利波特感悟作文 哈利波特感悟作文哈利波特感悟_900字  哈利。波特感悟逸夫中学初二一班付宇初指导老师;吴超蓝哈利。...