特点
- 所有元素都会根据元素的键值自动排序
- 默认排序规则是从小到大,可以通过仿函数指定排序规则
- map / multimap 属于关联式容器,底层结构是用红黑树实现
- 不可以修改键值,可以通过删除再插入的方式实现
- 可以根据 key 值快速找到 value 值
- 可以通过下标
[]
的方式快速查找、插入和更新对应的 value
案例
- 公司今天招聘了10个员工(ABCDEFGHIJ),10 名员工进入公司之后,需要指派员工在哪个部门工作
- 员工信息有: 姓名 工资组成;部门分为:策划、美术、研发
- 随机给 10 名员工分配部门和工资
- 通过 multimap 进行信息的插入 key(部门编号) value(员工)
- 分部门显示员工信息
思路:
- 创建 10 名员工,放到 vector 中
- 遍历 vector 容器,取出每个员工,进行随机分组
- 分组后,将员工部门编号作为 key,具体员工作为 value,放入到 multimap 容器中
- 分部门显示员工信息
class Worker{
public:
Worker(string name, int salary){
m_name = name;
m_salary = salary;
}
void printWorker(){
cout << "姓名:" << m_name << " 工资:" << m_salary << endl;
}
private:
string m_name;
int m_salary;
};
void createWorkers(vector<Worker> &v){
string nameSeed = "ABCDEFGHIJ";
for(int i = 0; i < nameSeed.length(); ++i){
string name = "员工"; // 注意:不能写成 name = "员工" + nameSeed[i]
name += nameSeed[i];
v.push_back(Worker(name, rand() % 10000 + 5000));
}
}
void groupWorker(vector<Worker> &v, multimap<int, Worker> &m){
for(const auto &w : v){
int depId = rand() % 3;
m.insert({depId, w});
}
}
int main()
{
srand((unsigned int)time(NULL));
// 创建员工
vector<Worker> vWorker;
createWorkers(vWorker);
// 员工分组
multimap<int, Worker> mWorker;
groupWorker(vWorker, mWorker);
// 打印 multimap 结果
for(auto it = mWorker.begin(); it != mWorker.end(); it++){
cout << "部门:" << it->first << " ";
it->second.printWorker();
}
cout << "-----------------------------" << endl;
// 按部门分组打印
cout << "部门0:" << endl;
auto it = mWorker.find(0);
int num = mWorker.count(0);
for(int i = 0; it != mWorker.end() && i < num; it++, i++){
it->second.printWorker();
}
cout << "-----------------------------" << endl;
cout << "部门1:" << endl;
it = mWorker.find(1);
num = mWorker.count(1);
for(int i = 0; it != mWorker.end() && i < num; it++, i++){
it->second.printWorker();
}
cout << "-----------------------------" << endl;
cout << "部门2:" << endl;
it = mWorker.find(2);
num = mWorker.count(2);
for(int i = 0; it != mWorker.end() && i < num; it++, i++){
it->second.printWorker();
}
return 0;
}
输出:
部门:0 姓名:员工D 工资:6725
部门:0 姓名:员工H 工资:12290
部门:0 姓名:员工I 工资:8753
部门:1 姓名:员工A 工资:11577
部门:1 姓名:员工C 工资:10892
部门:1 姓名:员工F 工资:12622
部门:2 姓名:员工B 工资:6047
部门:2 姓名:员工E 工资:5629
部门:2 姓名:员工G 工资:8954
部门:2 姓名:员工J 工资:11160
-----------------------------
部门0:
姓名:员工D 工资:6725
姓名:员工H 工资:12290
姓名:员工I 工资:8753
-----------------------------
部门1:
姓名:员工A 工资:11577
姓名:员工C 工资:10892
姓名:员工F 工资:12622
-----------------------------
部门2:
姓名:员工B 工资:6047
姓名:员工E 工资:5629
姓名:员工G 工资:8954
姓名:员工J 工资:11160