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

需求:公司招了十个员工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,也就是员工信息,员工信息又包括姓名和工资,依次输出即可

cpp 复制代码
#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;
}

运行结果:

相关推荐
盐烟5 分钟前
C语言-函数练习1
c语言·开发语言·笔记
旧故新长10 分钟前
MyBatis 类型处理器(TypeHandler)注册与映射机制:JsonListTypeHandler和JsonListTypeHandler注册时机
java·开发语言·mybatis
simple_whu13 分钟前
Visual Studio C/C++编译器cl.exe的/source-charset与/execution-charset设置项
c语言·c++·visual studio
GOATLong23 分钟前
网络基础概念
linux·运维·服务器·网络·arm开发·c++
我是苏苏30 分钟前
消息中间件RabbitMQ02:账号的注册、点对点推送信息
开发语言·后端·ruby
工藤新一¹1 小时前
C++/SDL 进阶游戏开发 —— 双人塔防(代号:村庄保卫战 14)
开发语言·c++·游戏引擎·游戏开发·sdl·实践项目
钢铁男儿1 小时前
C#核心技术解析:静态类型、dynamic与可空类型
开发语言·c#
卓越进步2 小时前
层级时间轮的 Golang 实现原理与实践
开发语言·后端·golang
zandy10112 小时前
嵌入式BI开发指南:如何通过衡石API将分析能力集成到业务系统?
开发语言·python·嵌入式
沉迷...2 小时前
el-input限制输入只能是数字 限制input只能输入数字
开发语言·前端·elementui