特点

  • 所有元素都会根据元素的键值自动排序
  • 默认排序规则是从小到大,可以通过仿函数指定排序规则
  • map / multimap 属于关联式容器,底层结构是用红黑树实现
  • 不可以修改键值,可以通过删除再插入的方式实现
  • 可以根据 key 值快速找到 value
  • 可以通过下标 [] 的方式快速查找、插入和更新对应的 value

案例

  • 公司今天招聘了10个员工(ABCDEFGHIJ),10 名员工进入公司之后,需要指派员工在哪个部门工作
  • 员工信息有: 姓名 工资组成;部门分为:策划、美术、研发
  • 随机给 10 名员工分配部门和工资
  • 通过 multimap 进行信息的插入 key(部门编号) value(员工)
  • 分部门显示员工信息

思路:

  1. 创建 10 名员工,放到 vector
  2. 遍历 vector 容器,取出每个员工,进行随机分组
  3. 分组后,将员工部门编号作为 key,具体员工作为 value,放入到 multimap 容器中
  4. 分部门显示员工信息
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