一:
在本文中,我们将探讨如何在C++中使用vector
和multimap
容器来管理一个简单的员工数据系统。我们将创建一个员工类,随机生成员工数据,将员工分组,并展示各组员工的详细信息。此示例展示了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的vector
和multimap
容器来管理和展示复杂数据。通过这种方式,我们可以有效地组织数据,并利用容器自带的功能来简化代码和提高效。
二、完整代码
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;
}