STL经典案例(二)——公司招员工

news2024/9/22 21:13:29

需求:公司招了十个员工ABCDEFGHIJ,公司有五个部门,公司随机给这十个员工分配薪水,并且随机将这十名员工分配到不同的部门。

员工类中成员属性为姓名和工资,成员方法为设置姓名、设置工资、获得姓名、获得工资
部门有五个,通过宏定义进行设置
员工放到vector容器中
通过multimap将部门编号和员工进行绑定
函数createWorker用于创建员工并为其分配薪水
函数setGroup将员工与部门编号进行绑定
函数showWorkerBydepartmentId按部门进行显示员工信息

主要涉及内容:vector和multimap容器创建,插入,查找和访问、类的创建和通过成员方法访问私有成员变量

步骤:

1,通过vector容器创建一个存放Worker数据类型的容器workers
2,创建Worker类,成员属性有姓名和薪资、成员方法有获取姓名、设置姓名、获取薪资、设置薪资
3,创建工人函数createWorker,将存放存放所用员工的vector容器workers传入,并通过push_back依次将员工传入到workers容器总
4,进行小测试(A)一下,看看是否成功创建十个工人
5,使用multimap实现员工分组,岗位和员工进行绑定,实现员工分组函数为setGroup
6,setGroup员工分组函数传入存放私有员工的vector容器workers和用于将员工和部门编号进行绑定的multimap容器department_worker,为每个员工与部门进行绑定,最终得到的department_workerkey为部门,value为具体的某位员工,其中std::vector<Worker> workers;std::multimap<int, Worker> department_worker;
7,按部门显示员工,调用函数showWorkerBydepartmentId进行显示,首先multimap中存入的数会自动按key进行排序,通过find函数查找不同的部门编号,返回迭代器;通过count函数查找不同部门的人数;最终进行迭代器进行遍历输出即可;multimap的first为key,second为value,我们要的是value,也就是员工信息,员工信息又包括姓名和工资,依次输出即可

#include <iostream>
#include <vector>
#include <ctime>
#include <map>

#define ALGORITHM 1 //算法部
#define PROJECT   2 //项目部
#define SALE      3 //销售部
#define SOFTWARE  4 //软件部
#define MACHINERY 5 //机械部

class Worker //员工类,包括姓名和薪资成员属性,成员方法包括返回姓名和薪资
{
public:
	Worker() {};

	Worker(std::string name,int salary) 
	{
		this->name_ = name;
		this->salary_ = salary;
	}
	
	void setName(std::string name) 
	{
		this->name_ = name;
	}

	void setSalary(int salary)
	{
		this->salary_ = salary;
	}

	std::string getName() 
	{
		return this->name_;
	}

	int getSalary() 
	{
		return this->salary_;
	}

private:
	std::string name_;
	int salary_;
};


//创建工人函数
void createWorker(std::vector<Worker>& w) //记得传引用哈
{
	//员工ABCDEFGHIJ共十名
	std::string namelist = "ABCDEFGHIJ";
	for (int i = 0; i < 10; i++) //创建十名员工
	{
		Worker worker;
		std::string name = "员工";
		
		//创建员工姓名
		name += namelist[i]; //方法一,+号运算符重载
		//name.append(1,namelist[i]); //方法二,append破解
		
		//创建员工薪资
		int saray = rand() % 10000 + 6000;//(0+6000) - (9999+6000)

		worker.setName(name);
		worker.setSalary(saray); 

		w.push_back(worker);//把这个员工放入到vector容器中,该vector容器存放的都是Worker

	}
}

void setGroup(std::vector<Worker>&v,std::multimap<int,Worker> &m) //对每个员工进行工作岗位的绑定。记得传引用哈
{
	for (std::vector<Worker>::iterator it = v.begin(); it != v.end(); it++) //遍历每个员工,并对每个员工进行绑定工作岗位
	{
		//随机生成部门编号,假如有5个部门
		int departmentId = rand() % 5 + 1;//1,2,3,4,5
		//通过multimap容器将员工进行绑定工作岗位
		m.insert(std::make_pair(departmentId,*it));//id和员工绑定,key为部门编号,value为员工
	}
}

void showWorkerBydepartmentId(std::multimap<int, Worker>& w) //按照不同的部门进行显示员工,记得传引用哈
{
	// 假如十个人分配的部门为;AB为算法部门(key=1),CDEF为项目部门(key=2),GHIJ为销售部们(key=3),...
	// 当然如何分配的部门是通过随机数进行分配的
	std::cout << "算法部:" << std::endl;
	std::multimap<int, Worker>::iterator pos = w.find(ALGORITHM);//从multimap容器中查找key为1,即
	int count = w.count(ALGORITHM); //统计multimap容器中key为1的有几个,即算法部门的总人数
	int index = 0;
	if (count != 0) 
	{
		for (; pos != w.end() && index < count; pos++, index++)
		{
			//可以直接把pos当成指针使用pos->second,也可以取指针的值使用(*pos).second
			std::cout << "姓名: " << pos->second.getName() << ",工资: " << (*pos).second.getSalary() << std::endl;
		}
	}
	else 
	{
		std::cout << "算法部没招到人~~~" << std::endl;
	}

	std::cout << "---------------------------------------------------" << std::endl;

	std::cout << "项目部:" << std::endl;
	pos = w.find(PROJECT);//从multimap容器中查找key为2,即
	count = w.count(PROJECT); //统计multimap容器中key为1的有几个,即项目部门的总人数
	index = 0;
	if (count != 0) 
	{
		for (; pos != w.end() && index < count; pos++, index++)
		{
			//可以直接把pos当成指针使用pos->second,也可以取指针的值使用(*pos).second
			std::cout << "姓名: " << pos->second.getName() << ",工资: " << (*pos).second.getSalary() << std::endl;
		}
	}
	else 
	{
		std::cout << "项目部没招到人~~~" << std::endl;
	}

	std::cout << "---------------------------------------------------" << std::endl;

	std::cout << "销售部:" << std::endl;
	pos = w.find(SALE);//从multimap容器中查找key为3,即
	count = w.count(SALE); //统计multimap容器中key为3的有几个,即销售部门的总人数
	index = 0;
	if (count!=0)
	{
		for (; pos != w.end() && index < count; pos++, index++)
		{
			//可以直接把pos当成指针使用pos->second,也可以取指针的值使用(*pos).second
			std::cout << "姓名: " << pos->second.getName() << ",工资: " << (*pos).second.getSalary() << std::endl;
		}
	}
	else 
	{
		std::cout << "销售部没招到人~~~" << std::endl;
	}

	std::cout << "---------------------------------------------------" << std::endl;

	std::cout << "软件部:" << std::endl;
	pos = w.find(SOFTWARE);//从multimap容器中查找key为4,即
	count = w.count(SOFTWARE); //统计multimap容器中key为4的有几个,即软件部门的总人数
	index = 0;
	if (count != 0) 
	{
		for (; pos != w.end() && index < count; pos++, index++)
		{
			//可以直接把pos当成指针使用pos->second,也可以取指针的值使用(*pos).second
			std::cout << "姓名: " << pos->second.getName() << ",工资: " << (*pos).second.getSalary() << std::endl;
		}
	}
	else 
	{
		std::cout << "软件部没招到人~~~" << std::endl;
	}

	std::cout << "---------------------------------------------------" << std::endl;

	std::cout << "机械部:" << std::endl;
	pos = w.find(MACHINERY);//从multimap容器中查找key为5,即
	count = w.count(MACHINERY); //统计multimap容器中key为5的有几个,即机械部门的总人数
	index = 0;
	if (count != 0) 
	{
		for (; pos != w.end() && index < count; pos++, index++)
		{
			//可以直接把pos当成指针使用pos->second,也可以取指针的值使用(*pos).second
			std::cout << "姓名: " << pos->second.getName() << ",工资: " << (*pos).second.getSalary() << std::endl;
		}
	}
	else 
	{
		std::cout << "机械部没招到人~~~" << std::endl;
	}

}

int main(int agrc, char* argv[]) 
{
	srand((unsigned int)time(NULL));//随机种子初始化

	//1,通过vector容器创建员工
	std::vector<Worker> workers;
	//创建工人
	createWorker(workers);
	//小测试A
	/*
	for (std::vector<Worker>::iterator it = workers.begin(); it != workers.end(); it++) 
	{
		std::cout << "姓名:" << (*it).getName() << " ,薪资" << it->getSalary() << std::endl;//可以通过*it取指针的值,也可以通过->直接使用指针it
	}
	*/

	std::multimap<int, Worker> department_worker;//将每个员工与部门进行绑定
	setGroup(workers, department_worker);

	showWorkerBydepartmentId(department_worker);//按照部门显示员工

	return 0;
}

运行结果:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Electron 开发桌面应用程序用于对接USB Audio Class协议

开发用于对接USB Audio Class协议的Electron桌面应用程序是一个复杂的任务&#xff0c;可能涉及多个开源库和项目的组合。以下是一些开源项目和库&#xff0c;它们可以帮助你实现这个目标&#xff1a; 1. Electron Electron 是一个用于构建跨平台桌面应用程序的框架。你可以使…

【云原生】Prometheus Pushgateway使用详解

目录 一、前言 二、Pushgateway概述 2.1 什么是Pushgateway 2.1.1 Pushgateway在Prometheus中的位置 2.2 为什么需要Pushgateway 2.3 Pushgateway作用 2.4 Pushgateway 工作原理 2.5 Pushgateway 使用场景 2.6 Pushgateway 优缺点 三、Pushgateway 部署 3.1 二进制安…

[C#]基于C# winform结合llamasharp部署llama3中文的gguf模型

【llmasharp源码】 https://github.com/SciSharp/LLamaSharp 【测试模型】 https://www.modelscope.cn/pooka74/LLaMA3-8B-Chat-Chinese-GGUF.git 【测试通过环境】 vs2019 netframework4.7.2 llamasharp0.15.0 cuda11.7.1cudnn8.8.0 注意测试发现使用cpu推理非常卡&a…

Stable Diffusion绘画 | ControlNet应用-SoftEdge(软边缘):让转绘更柔和

SoftEdge(软边缘) Canny(硬边缘) 有时候捕捉的细节过多&#xff0c;其实有时候并不需要那么多的细节。 例如下图中&#xff0c;围巾上的网格细节全部都被捕捉下来了&#xff1a; 切换到「SoftEdge(软边缘)」&#xff0c;它只重点抓取轮廓边缘&#xff0c;而且线条会比 Canny …

优购电商小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;商品分类管理&#xff0c;商品信息管理&#xff0c;留言板管理&#xff0c;订单管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;商品信息&#xf…

入门 PyQt6 看过来(项目)26 在线购物-主页面

功能导航页面很简单&#xff0c;就几个按钮功能。效果如下图&#xff1a; 1 主界面 ​ 包含 “商品选购”、”下单结算“、”销售分析“四个按钮以及“功能导航”标题。 2 工程目录 首先先创建工程目录及子目录&#xff1a; ​ 3 代码 主窗口文件为Main.py&#xff0c;其…

第2章 C语言基础知识

第2章 C语言基础知识 1.printf()函数 在控制台输出数据&#xff0c;需要使用输出函数&#xff0c;C语言常用的输出函数为printf()。 printf()函数为格式化输出函数&#xff0c;其功能是按照用户指定的格式将数据输出到屏幕上。 printf(“格式控制字符串”,[输出列表]); 格式控…

C++ 124类和对象_运算符重载_赋值

C 124类和对象_运算符重载_赋值 学习内容 解决自定义对象之间赋值是因析构函数重复释放内存时引发的异常问题 结果 代码 #include<iostream> using namespace std;//cout 在这里&#xff0c;没有它会报错//类和对象_运算符重载_赋值 //学习内容 //解决自定义对…

【Qt】Qt窗口 | 菜单栏QMenuBar

文章目录 一. 菜单栏二. 代码创建&使用菜单栏1. 创建菜单栏2. 在菜单栏中添加菜单3. 创建菜单项4. 在菜单项之间添加分割线5. 添加快捷方式6. 菜单/菜单项添加图标7. 添加子菜单 三. 图形化创建菜单栏 窗口 Qt 中窗口是通过QMainWindow类实现的 QMainWindow 是一个为用户提…

React使用useRef ts 报错

最近在写自己的React项目&#xff0c;我在使用useRef钩子函数的时候发现 TS2322: Type MutableRefObject<HTMLDivElement | undefined> is not assignable to type LegacyRef<HTMLDivElement> | undefined Type MutableRefObject<HTMLDivElement | undefined&g…

代码随想录算法训练营第十五天(一)| 110.平衡二叉树 (优先掌握递归)257. 二叉树的所有路径

110.平衡二叉树 题目&#xff1a; 给定一个二叉树&#xff0c;判断它是否是 平衡二叉树 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff1a;root [1,2,2,3,3,null,null,4,4] 输出&#xff1a;fa…

vuex的原理和使用方法

简介 Vuex 是 Vue.js 应用的状态管理模式&#xff0c;它为应用内的所有组件提供集中式的状态&#xff08;数据&#xff09;管理。可以帮我们管理 Vue 通用的数据 (多组件共享的数据)。 Vuex的构成 state&#xff1a;state 是 Vuex 的数据中心&#xff0c;也就是说state是用来…

【生成式人工智能-十一一个不修改模型就能加速语言模型生成的方法】

一个加速语言模型生成的方法 现在语言模型的一个弊端speculative decoding预言家预测的问题 speculative decoding 模块的实现方法NAT Non-autoregressive模型压缩使用搜索引擎 一些更复杂些的speculative decoding 实现方式 speculative decoding 是一个适用于目前生成模型的加…

软件运维实施维保方案(Doc完整版原件)

1.项目情况 2.服务简述 2.1服务内容 2.2服务方式 2.3服务要求 2.4服务流程 2.5工作流程 2.6业务关系 2.7培训 3.资源提供 3.1项目组成员 3.2服务保障 软件全套资料部分文档清单&#xff1a; 工作安排任务书&#xff0c;可行性分析报告&#xff0c;立项申请审批表&#xff0c;产…

NodeJS:查看、设置 nodejs 堆内存

一、查看nodejs 堆内存 vite.config.ts 从Node.js v10.0.0开始&#xff0c;v8模块被引入&#xff0c;允许你访问V8引擎的一些内部特性&#xff0c;包括堆内存统计信息。 import v8 from v8 // 可用内存总量 console.log(Total available heap size: ${v8.getHeapStatistics()…

2024年优秀的网站建设公司推荐

如今&#xff0c;高达 48% 的用户认为&#xff0c;判断企业信誉的首要因素是其网站设计。我整理了一份 2024 年全球顶级网站设计公司名单。 企业为什么要投资网站设计和开发&#xff1f; 数字平台或社交媒体在当前情况下取得了飞跃&#xff0c;帮助企业上以数字方式推广他们的…

【数据结构】顺序表——赋源码(结尾)

目录 1. 线性表 2. 顺序表 2.1 概念与结构 2.2 分类 2.2.1 静态顺序表 2.2.2 动态顺序表 2.3 动态顺序表的实现 正文 1. 线性表 线性表&#xff08; linear list &#xff09;是n个具有相同特性的数据元素的有限序列。 线性表是⼀种在实际中⼴泛使 ⽤的数据结构&#x…

停止项目大小调整,开始搜索层自动缩放!

作者&#xff1a;来自 Elastic Matteo Piergiovanni&#xff0c;John Verwolf 我们新的 serverless 产品的一个关键方面是允许用户部署和使用 Elastic&#xff0c;而无需管理底层项目节点。为了实现这一点&#xff0c;我们开发了搜索层自动扩展&#xff0c;这是一种根据我们将在…

华为路由的AAA是什么?

1.AAA及用户管理概述 华为路由的AAA是Authentication(认证)、‌Authorization(授权)和Accounting(计费)的简称&#xff0c;‌是一种提供认证、‌授权和计费的安全管理机制。‌ AAA作为一种网络安全管理机制&#xff0c;‌主要提供以下功能和服务&#xff1a;‌ 认证&#xff…

Linux系统编程:线程 1

1.线程的概念 线程——轻量级的进程&#xff0c;线程是CPU执行的最小单位&#xff0c;进程是资源分配的基本单位&#xff0c;线程的创建和调度的时空开销都比进程小&#xff1b; 2.线程的组成 线程组成&#xff1a;线程pid&#xff0c;程序计数器&#xff0c;寄存器集合&…