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

相关内容

热门资讯

爱的创可贴大结局 ,爱的创可贴... 爱的创可贴大结局 目录爱的创可贴大结局 爱的创可贴第几集在一起爱的创可贴结局是什么?电视剧爱的创可贴...
爱在春天结局是什么 ,爱在春天... 爱在春天结局是什么 目录爱在春天结局是什么 爱在春天结局是什么爱在春天大结局爱在春天大结局爱在春天结...
怎么做水印 ,身份证水印怎么做... 怎么做水印 目录怎么做水印 身份证水印怎么做?ps怎么做水印怎么做水印 2. 设计水印:在设计水印时...
夫妻那些事的演员 ,夫妻那些事... 夫妻那些事的演员 目录夫妻那些事的演员 夫妻那些事主演是谁夫妻那些事演员表夫妻那些事演员表介绍夫妻那...
钉钉,下沉进农田 在这个古老的产业里,数字化没有被放到更高的位置,但难点依旧存在。钉钉恰是...
2023年全国最新二级建造师精... 百分百题库提供二级建造师考试试题、二建考试预测题、二级建造师考试真题、二建证考试题库等,...
点金胜手结局 ,点金胜手结局 ... 点金胜手结局 目录点金胜手结局 点金胜手结局点金胜手30黄宗泽最后跟谁在一起点金胜手大结局点金胜手结...
天苍苍野茫茫是什么歌 ,天苍苍... 天苍苍野茫茫是什么歌 目录天苍苍,野茫茫这句歌词的歌名是什么?天苍苍野茫茫风吹草低见牛羊是哪里的民歌...
未来日记漫画结局,《未来日记》... 未来日记漫画结局目录未来日记漫画结局《未来日记》结局是什么?漫画《未来日记》最后的结局是什么样的?未...
投名状讲的是什么 ,投名状说的... 投名状讲的是什么 目录投名状讲的是什么 投名状说的是什么事情投名状这个电影到底表达了个什么意思投名状...
《Spring Boot 趣味... 牛刀小试——五分钟入门 Spring Boot 万物皆可 Hello World 创建一个 Web ...
硬核~ 阿里人都在内卷的Spr... 前言 这份SpringBoot实战文档,结合典型业务场景,全面介绍基于S...
新娘印度电视剧大结局 ,印度电... 新娘印度电视剧大结局 目录新娘印度电视剧大结局 印度电视剧新娘的最后结局是什么?大结局的印度剧《新娘...
当婆婆遇上妈结局 ,《婆婆遇上... 当婆婆遇上妈结局 目录当婆婆遇上妈结局 《婆婆遇上的妈》电视剧结局是什么?《当婆婆遇上妈》的结局是啥...
洪水来临时正确的做法是什么,发... 洪水来临时正确的做法是什么目录洪水来临时正确的做法是什么发生洪水时的正确做法是什么遇到洪水的正确做法...
baci是什么意思 ,baci... baci是什么意思 目录baci是什么意思 baci是什么意思面基是什么意思啊?baci是什么意思 ...
经典卷积模型回顾26—基于知识... ResNet-152 是由微软亚洲研究院 (Microsoft Research Asia) 发布的...
HTTPS 之fiddler抓... Jmeter接口测试和接口自动化测试从入门到精通,全套项目实战!...
Vmware Ubuntu虚拟... 一、背景 先来说一下我的需求背景,我是在VMware中安装的Ubuntu虚拟机...
友谊的小船说翻就翻是什么意思 ... 友谊的小船说翻就翻是什么意思 目录友谊的小船说翻就翻是什么意思 网络语友谊的小船说翻就翻出自哪里,是...
爱迪奥特曼大结局,关于EVA大... 爱迪奥特曼大结局目录爱迪奥特曼大结局关于EVA大结局eva的大结局是什么?迪迦奥特曼 的结局是什么?...
废青是什么意思 ,自称自己是“... 废青是什么意思 目录00后到底是怎样一代人?自称自己是“废柴”,“废柴”啥意思董遇的三余是什么意思 ...
关于蛇的电影 极速百科网 极速... 关于蛇的电影目录关于蛇的电影关于蛇的电影有关蛇的电影有哪些?关于蛇的电影关于蛇的电影说到关于蛇的电影...
智能自动搬运设备四向穿梭车AG... 四向穿梭车现已成为穿梭车货架系统中的重要核心,作为高新科技先进的自动化物料搬运设备&#...
大数据分析工具Power BI... 导入数据操作介绍进入PowBI,弹出的如下页面也可以直接关闭,在Powe...
不是所有电脑换了固态硬盘=秒开...        即使是做简单的拷贝,其速度可能还不如机械硬盘。而3A游戏大作的文件体积也...
一笑倾人城再笑倾人国出自 ,“... 一笑倾人城再笑倾人国出自 目录一笑倾人城再笑倾人国出自 “一笑倾人城,再笑倾人国。”出自……?一笑倾...
小爸爸插曲是什么,《小爸爸》的... 小爸爸插曲是什么目录小爸爸插曲是什么《小爸爸》的插曲是什么名字小爸爸里面的插曲《小爸爸》里面的所有插...
斗罗大陆大师的结局,斗罗大陆3... 斗罗大陆大师的结局目录斗罗大陆大师的结局斗罗大陆3最后大师和谁结婚了史莱克七怪成神后大师去哪了斗罗大...
TextView用Spanna... textContent.getViewTreeObserver().addOnPreDrawList...