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

server/2024/10/16 2:27:27/

需求:公司招了十个员工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).secondstd::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).secondstd::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).secondstd::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).secondstd::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).secondstd::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.ppmy.cn/server/102465.html

相关文章

Esxi 7.0 安装windows xp 问题汇总

一.需求 因为工作需要某些应用必须在xp 上安装才能使用 二.方案 因为用的次数很少&#xff0c;准备在esxi 7.0上安装xp 做使用&#xff0c;后期迁移也方便&#xff0c;不用安装在物理机&#xff0c;也不用考虑物理机存放问题&#xff0c;一年只有2次。 下载win xp esxi7.0 …

Vue 3 中,确保 Tooltip 组件能够正确响应动态变化的标签内容

在 Vue 3 中&#xff0c;确保 Tooltip 组件能够正确响应动态变化的标签内容&#xff0c;需要注意以下几点&#xff1a; 响应式数据&#xff1a; 确保绑定到 Tooltip 组件的内容是响应式的。这意味着内容应该来自组件的 data 属性或者计算属性&#xff08;computed&#xff09;…

Mybatis的分页,延迟加载和缓存

目录 分页&#xff1a; 方式一&#xff1a;利用 limit 实现物理分页 利用limit的关键字分页 方式二&#xff1a;RowBounds集合逻辑分页 方式三&#xff1a;插件分页 延迟加载和立即加载&#xff1a; 什么是立即加载&#xff1a; 什么是延迟加载 延迟加载的配置 缓存&a…

设计模式: 访问者模式

文章目录 一、介绍二、模式结构三、优缺点1、优点2、缺点 四、应用场景 一、介绍 Visitor 模式&#xff08;访问者模式&#xff09;是一种行为设计模式&#xff0c;它允许在不修改对象结构的前提下&#xff0c;增加作用于一组对象上新的操作。就增加新的操作而言&#xff0c;V…

SSH端口转发

文章目录 1. 什么是SSH端口转发2. SSH本地端口转发2.1 两台机器的本地端口转发2.2 三台机器的本地端口转发 3. SSH的远程端口转发4. 总结5. 参考博客 1. 什么是SSH端口转发 SSH端口转发可以看作是一种代理&#xff0c;只要你的电脑和服务器能够建立SSH连接&#xff0c;那么就可…

汽车IVI中控OS Linux driver开发实操(二十四):I2C设备驱动的编写

概述: 在Linux驱动中I2C系统中主要包含以下几个成员: I2C adapter(即I2C适配器,用来控制各种I2C从设备,其驱动需要完成对适配器的完整描述,最主要的工作是需要完成i2c_algorithm结构体。这个结构体包含了此I2C控制器的数据传输具体实现,以及对外上报此设备所支持的功…

Redis5.0单实例数据迁移至分片集群

Redis 5.0 数据迁移至分片集群主要思路是&#xff1a; 如果你的数据全部在 DB0 &#xff0c;那么按照下边的步骤来操作 1、创建好分片集群 2、需要手动刷新触发全部落盘&#xff0c;备份源rdb或者aof 3、停止原实例的写入&#xff08;需要你暂停所有相关的服务&#xff0c;…

微信小程序开发构建npm

构建微信小程序中构建npm报错&#xff1a; message&#xff1a; NPM packages not found. Please confirm npm packages which need to build are belong to miniprogramRoot directory. Or you may edit project.config.jsons packNpmManually and packNpmRelationList appid…