C++中使用Multimap和Vector管理和展示数据

一:

在本文中,我们将探讨如何在C++中使用vectormultimap容器来管理一个简单的员工数据系统。我们将创建一个员工类,随机生成员工数据,将员工分组,并展示各组员工的详细信息。此示例展示了C++标准模板库(STL)的强大功能和灵活性。

1. 定义员工类

我们首先定义一个worker类,包含员工的名字(name)和薪水(salary)。这是一个简单的公有类,成员变量可以直接访问。

cpp 复制代码
class worker {
public:
    string name;
    int salary;
};
2. 生成员工数据

使用vector容器来存储worker对象。vector是一种动态数组,提供快速的随机访问和尾部插入删除操作。

createworker函数用于生成10名员工的数据。每名员工的名字是"NAME"后跟一个字母,薪水是随机生成的,范围在10000到19999之间。

cpp 复制代码
void createworker(vector<worker>& v) {
    string nameseed = "BCDEFGHIJ";
    for (int i = 0; i < 10; i++) {
        worker worker1;
        worker1.name = "NAME";
        worker1.name += nameseed[i];
        worker1.salary = rand() % 10000 + 10000;
        v.push_back(worker1);
    }
}
3. 分组存储

multimap容器用于按组存储员工数据。multimap是允许键重复的排序关联容器,非常适合管理具有自然分组但又需要排序的数据。

我们将员工随机分为三组(ART, SCIENCE, MATH)。setgroup函数将vector中的每个员工根据随机生成的组号插入到multimap中。

cpp 复制代码
void setgroup(vector<worker>& v, multimap<int, worker>& m) {
    for (vector<worker>::iterator it = v.begin(); it != v.end(); it++) {
        int group = rand() % 3 + 1;  // 1-3的组号
        m.insert(make_pair(group, *it));
    }
}
4. 显示分组数据

最后,我们通过showworker函数来展示各组的员工数据。对于每一组,我们首先查找该组的第一个员工,然后遍历该组所有员工,打印他们的名字和薪水。

cpp 复制代码
void showworker(multimap<int, worker>& m) {
    cout << "ART:" << endl;
    displayGroup(m, ART);
    cout << "SCIENCE:" << endl;
    displayGroup(m, SCIENCE);
    cout << "MATH:" << endl;
    displayGroup(m, MATH);
}

void displayGroup(multimap<int, worker>& m, int groupID) {
    auto pos = m.find(groupID);
    int num = m.count(groupID);
    for (int index = 0; pos != m.end() && index < num; index++, pos++) {
        cout << "NAME:  " << pos->second.name << " salary:   " << pos->second.salary << endl;
    }
    cout << "--------------------------------------------" << endl;
}
5. 主函数

main函数中,我们初始化随机数生成器,创建员工vector,设置员工分组,并展示所有组的员工信息。

cpp 复制代码
int main() {
    srand((unsigned int)time(NULL));
    vector<worker>v;
    createworker(v);
    multimap<int, worker>m;
    setgroup(v, m);
    showworker(m);
    return 0;
}

结论

这个示例展示了如何使用C++ STL的vectormultimap容器来管理和展示复杂数据。通过这种方式,我们可以有效地组织数据,并利用容器自带的功能来简化代码和提高效。

二、完整代码

cpp 复制代码
#define ART 1
#define SCIENCE 2
#define MATH 3
class worker
{
public:
	string name;
	int salary;
};
void createworker(vector<worker>& v)
{
	string nameseed = "BCDEFGHIJ";
	for (int i = 0; i < 10; i++)
	{
		worker worker1;
		worker1.name = "NAME";
		worker1.name += nameseed[i];
		worker1.salary = rand() % 10000 + 10000;
		v.push_back(worker1);
	}
}
void setgroup(vector<worker>& v, multimap<int, worker>& m)
{
	for (vector<worker>::iterator it = v.begin(); it != v.end(); it++)
	{
		int group = rand() % 3+1;
		m.insert(make_pair(group, *it));
	}
}
void showworker(multimap<int, worker>& m)
{
	cout << "ART:" << endl;
	multimap<int, worker>::iterator pos = m.find(ART);
	int num = m.count(ART);
	int index = 0;
	for (; pos != m.end() && index != num; index++, pos++)
	{
		cout << "NAME:  " << pos->second.name << "salary:   " << pos->second.salary << endl;
	}
	cout << "-------------------------------------------- - " << endl;

	cout << "SCIENCE:" << endl;
	multimap<int, worker>::iterator pos1 = m.find(SCIENCE);
	int num1 = m.count(SCIENCE);
	int index1 = 0;
	for (; pos1 != m.end() && index1 != num1; index1++, pos1++)
	{
		cout << "NAME:  " << pos1->second.name << "salary:   " << pos1->second.salary << endl;
	}
	cout << "-------------------------------------------- - " << endl; 

	cout << "MATH:" << endl;
	multimap<int, worker>::iterator pos2 = m.find(MATH);
	int num2 = m.count(MATH);
	int index2 = 0;
	for (; pos2 != m.end() && index2 != num2; index2++, pos2++)
	{
		cout << "NAME:  " << pos2->second.name << "salary:   " << pos2->second.salary << endl;
	}
}
int main()
{
	srand((unsigned int)time(NULL));
	vector<worker>v;
	createworker(v);
	multimap<int, worker>m;
	setgroup(v,m);
	showworker(m);
	return 0;
}
相关推荐
Theodore_10222 小时前
4 设计模式原则之接口隔离原则
java·开发语言·设计模式·java-ee·接口隔离原则·javaee
‘’林花谢了春红‘’3 小时前
C++ list (链表)容器
c++·链表·list
----云烟----4 小时前
QT中QString类的各种使用
开发语言·qt
lsx2024064 小时前
SQL SELECT 语句:基础与进阶应用
开发语言
开心工作室_kaic4 小时前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端
向宇it4 小时前
【unity小技巧】unity 什么是反射?反射的作用?反射的使用场景?反射的缺点?常用的反射操作?反射常见示例
开发语言·游戏·unity·c#·游戏引擎
武子康4 小时前
Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试
java·开发语言·数据仓库·sql·mybatis·springboot·springcloud
转世成为计算机大神5 小时前
易考八股文之Java中的设计模式?
java·开发语言·设计模式
机器视觉知识推荐、就业指导5 小时前
C++设计模式:建造者模式(Builder) 房屋建造案例
c++
宅小海5 小时前
scala String
大数据·开发语言·scala