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;
}
相关推荐
yuanbenshidiaos1 分钟前
c++------------------函数
开发语言·c++
yuanbenshidiaos5 分钟前
C++----------函数的调用机制
java·c++·算法
程序员_三木13 分钟前
Three.js入门-Raycaster鼠标拾取详解与应用
开发语言·javascript·计算机外设·webgl·three.js
是小崔啊23 分钟前
开源轮子 - EasyExcel01(核心api)
java·开发语言·开源·excel·阿里巴巴
tianmu_sama29 分钟前
[Effective C++]条款38-39 复合和private继承
开发语言·c++
黄公子学安全32 分钟前
Java的基础概念(一)
java·开发语言·python
liwulin050633 分钟前
【JAVA】Tesseract-OCR截图屏幕指定区域识别0.4.2
java·开发语言·ocr
jackiendsc37 分钟前
Java的垃圾回收机制介绍、工作原理、算法及分析调优
java·开发语言·算法
Oneforlove_twoforjob42 分钟前
【Java基础面试题027】Java的StringBuilder是怎么实现的?
java·开发语言
羚羊角uou44 分钟前
【C++】优先级队列以及仿函数
开发语言·c++