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 <ctime>
  4. 以上设计的容器都要包含对应的头文件

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/350.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CANoe中使用CAPL刷写流程详解(Trace图解)(CAN总线)

&#x1f345; 我是蚂蚁小兵&#xff0c;专注于车载诊断领域&#xff0c;尤其擅长于对CANoe工具的使用&#x1f345; 寻找组织 &#xff0c;答疑解惑&#xff0c;摸鱼聊天&#xff0c;博客源码&#xff0c;点击加入&#x1f449;【相亲相爱一家人】&#x1f345; 玩转CANoe&…

史上最全最详细的Java架构师成长路径图,程序员必备

从新手码农到高级架构师&#xff0c;要经过几步&#xff1f;要多努力&#xff0c;才能成为为人倚重的技术专家&#xff1f;本文将为你带来一张程序员发展路径图&#xff0c;但你需要知道的是&#xff0c;天下没有普适的道理&#xff0c;具体问题还需具体分析&#xff0c;实践才…

Verilog实现组合逻辑电路

在verilog 中可以实现的数字电路主要分为两类----组合逻辑电路和时序逻辑电路。组合逻辑电路比较简单&#xff0c;仅由基本逻辑门组成---如与门、或门和非门等。当电路的输入发生变化时&#xff0c;输出几乎&#xff08;信号在电路中传递时会有一小段延迟&#xff09;立即就发生…

马上要面试了,还有八股文没理解?让ChatGPT来给你讲讲吧——如何更好使用ChatGPT?

最近这段时间 ChatGPT 掀起了一阵 AI 热潮&#xff0c;目前来看网上大部分内容都是在调戏 AI&#xff0c;很少有人写如何用 ChatGPT 做正事儿。 作为一个大部分知识都是从搜索引擎和 GitHub 学来的程序员&#xff0c;第一次和 ChatGPT 促膝长谈后&#xff0c;基本认定了一个事…

AI又进化了,突破性革命来了

大家好&#xff0c;我是 Jack。 2023 年&#xff0c;AI 真的杀疯了。短短不到一年的时间&#xff0c;当我们还在感慨 AI 一键生成的二次元画作精美万分的时候&#xff0c;它已经进化到了写实美照也能手到擒来的地步。 更多的效果&#xff0c;可以看刚刚发布的视频&#xff0c;…

爽,我终于掌握了selenium图片滑块验证码

因为种种原因没能实现愿景的目标&#xff0c;在这里记录一下中间结果&#xff0c;也算是一个收场吧。这篇文章主要是用selenium解决滑块验证码的个别案列。 思路&#xff1a; 用selenium打开浏览器指定网站 将残缺块图片和背景图片下载到本地 对比两张图片的相似地方&#x…

十大经典排序算法(上)

目录 1.1冒泡排序 1. 算法步骤 3.什么时候最快 4. 什么时候最慢 5.代码实现 1.2选择排序 1. 算法步骤 2. 动图演示 3.代码实现 1.3 插入排序 1. 算法步骤 2. 动图演示 3. 算法实现 1.4 希尔排序 1. 算法步骤 2. 动图演示 3.代码实现 1.5 归并排序 1. 算法步骤 2…

2023年中国高校计算机大赛-团队程序设计天梯赛(GPLT)上海理工大学校内选拔赛(同步赛) A — E

2023年中国高校计算机大赛-团队程序设计天梯赛&#xff08;GPLT&#xff09;上海理工大学校内选拔赛&#xff08;同步赛) 文章目录A -- A Xor B Problem题目分析codeB -- 吃苹果题目分析codeC -- n皇后问题题目分析codeD -- 分苹果题目分析codeE -- 完型填空题目分析codeA – A…

图像缩放对相机内外参矩阵的影响

参考资料&#xff1a;https://zhuanlan.zhihu.com/p/87185139 一、3D空间中点到图像的投影 设3D空间中的点(x,y,z)(x,y,z)(x,y,z)投影到图像上的像素坐标&#xff08;连续值&#xff0c;以左上角像素的左上角为原点的坐标系&#xff0c;注意与整数值的图像像素索引相区别&…

HTTPS的加密原理(工作机制)

现在很多网站使用的都是HTTPS协议,比如CSDN他们为什么要使用HTTPS协议而不是继续使用HTTP协议呢?以及HTTPS都做了些什么?HTTP协议与HTTPS有哪些区别? 下面我来 讲解这些问题?(篇幅可能有些长,请求耐心观看,我以0基础的角度去讲解这些东西, 如果你有一定的基础前面的跳过就好…

docker安装elasticsearch与head教程完整版—.NET Core Web Api与elasticsearch打造全站全文搜索引擎

默认已经有docker环境 下载与安装 elasticsearch &#xff0c;从hub.docker里面可以看到最新版本的镜像&#xff0c;选择你想要的版本 本教程是以 7.17.7 为案例&#xff0c;为啥不适用最新的&#xff0c;首先个人一般需用最新的版本&#xff0c;如果有亢很难填&#xff0c;其次…

三体到底是啥?用Python跑一遍就明白了

文章目录拉格朗日方程推导方程组微分方程算法化求解画图动图绘制温馨提示&#xff0c;只想看图的画直接跳到最后一节拉格朗日方程 此前所做的一切三体和太阳系的动画&#xff0c;都是基于牛顿力学的&#xff0c;而且直接对微分进行差分化&#xff0c;从而精度非常感人&#xf…

如何用Python求解微分方程组

文章目录odeint简介示例odeint简介 scipy文档中将odeint函数和ode, comples_ode这两个类称为旧API&#xff0c;是scipy早期使用的微分方程求解器&#xff0c;但由于是Fortran实现的&#xff0c;尽管使用起来并不方便&#xff0c;但速度没得说&#xff0c;所以有的时候还挺推荐…

Vite4 + Vue3 + vue-router4 动态路由

动态路由&#xff0c;基本上每一个项目都能接触到这个东西&#xff0c;通俗一点就是我们的菜单是根据后端接口返回的数据进行动态生成的。表面上是对菜单的一个展现处理&#xff0c;其实内部就是对router的一个数据处理。这样就可以根据角色权限或者一些业务上的需求&#xff0…

机器学习入门——线性回归

线性回归什么是线性回归&#xff1f;回归分析&#xff1a;线性回归&#xff1a;回归问题求解单因子线性回归简单实例评估模型表现可视化模型展示多因子线性回归什么是线性回归&#xff1f; 回归分析&#xff1a; 根据数据&#xff0c;确定两种或两种以上变量间相互依赖的定量…

自学大数据第六天~HDFS命令(一)

HDFS常用命令 查看hadoop版本 version hadoop version注意,没有 ‘-’ [hadoopmaster ~]$ hadoop version Hadoop 3.3.4 Source code repository https://github.com/apache/hadoop.git -r a585a73c3e02ac62350c136643a5e7f6095a3dbb Compiled by stevel on 2022-07-29T12:3…

【电赛MSP430系列】GPIO、LED、按键、时钟、中断、串口、定时器、PWM、ADC

文章目录MSP430一、GPIO二、点亮LED三、按键控制LED四、更改主时钟五、串口通信六、串口中断七、外部中断八、定时器九、定时器中断十、PWM十一、ADCMSP430 MSP430 是德州仪器&#xff08;TI&#xff09;一款性能卓越的超低功耗 16 位单片机&#xff0c;自问世以来&#xff0c…

程序员的逆向思维

前要&#xff1a; 为什么你读不懂面试官提问的真实意图&#xff0c;导致很难把问题回答到面试官心坎上? 为什么在面试结束时&#xff0c;你只知道问薪资待遇&#xff0c;不知道如何高质量反问? 作为一名程序员&#xff0c;思维和技能是我们职场生涯中最重要的两个方面。有时候…

【微信小程序】-- 网络数据请求(十九)

&#x1f48c; 所属专栏&#xff1a;【微信小程序开发教程】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &…

到底什么是跨域,如何解决跨域(常见的几种跨域解决方案)?

文章目录1、什么是跨域2、解决跨域的几种方案2.1、JSONP 方式解决跨域2.2、CORS 方式解决跨域&#xff08;常见&#xff0c;通常仅需服务端修改即可&#xff09;2.3、Nginx 反向代理解决跨域&#xff08;推荐使用&#xff0c;配置简单&#xff09;2.4、WebSocket 解决跨域2.5、…