STL-map

map容器的特点:

1、所有元素都会根据元素的键值自动排序
2、所有的元素都是pair,同时拥有键值和实值。
第一个参数:键值 第二个参数:实值
在这里插入图片描述

map几种插入方式和遍历

对组实现,.first .second

#include <iostream>
#include<map>
#include<string>
#include<algorithm>
using namespace std;
void PrintMap01(map<int,string>&m)
{
    for(map<int,string>::const_iterator it=m.begin();it!=m.end();it++)
    {
        cout<<(*it).first<<" "<<(*it).second<<endl;
    }
}
void test01()
{
    //存放9527--"星爷"  10086-"移动"   10010--"联通" 10000--"电信"
        //int为键值的类型  string为实值的类型
    map<int,string> m;
    m.insert(pair<int,string>(9527,"星爷"));
    m.insert(make_pair(10086,"移动"));
    m.insert(map<int,string>::value_type(10010,"联通"));
    m[1000]="电信";//读map的时候推荐

    //m[10] 寻找key为10的实值
    //但是:如果容器中没有key为10 使用m[10] 会创建一个key为10实值为空的 对组
    //如果容器中有key为10  那么m[10]代表key=10的实值
    //建议:10是存在的
    cout<<m[10]<<endl;
    PrintMap01(m);
    cout<<m[9527]<<endl;//只想查看key==9527 的实值  (保证key是存在的)
     //如果不能确定key值是否存在
    map<int,string>::const_iterator ret;
    ret=m.find(10086);
    if(ret==m.end())
    {
        cout<<"没有找到"<<endl;
    }
    else
       {
        cout<<(*ret).first<<" "<<(*ret).second<<endl;
    }
}

map和vector容器配合使用(重要)

LOL职业联赛:有4个战队 随机抽签出场 请打印出场顺序

#include<numeric>
#include<time.h>
#include<stdlib.h>
void test02()
{
    srand(time(NULL));
    //战队容器(战队编号,战队名称)
    map<int,string>m;
    m.insert(make_pair(1,"RNG"));
    m.insert(make_pair(2,"IG"));
    m.insert(make_pair(3,"WE"));
    m.insert(make_pair(4,"EDG"));

    //使用vector存放战队编号
    vector<int> v;
    v.push_back(1);
     v.push_back(2);
     v.push_back(3);
      v.push_back(4);
    //随机抽签(洗牌) 打乱容器的元素顺序
      random_shuffle(v.begin(),v.end());
    //随机出场
      for_each(v.begin(),v.end(),[&](int val){//传引用
          cout<<m[val]<<"战队出场了"<<endl;
      });
}

multimap容器

multimap允许key相同,map不允许key相同

void test03()
{
    map<int,string> m;
       m.insert(make_pair(1,"RNG"));
       m.insert(make_pair(1,"IG"));

       cout<<m.count(1)<<endl;//1

       multimap<int,string> m1;
       m1.insert(make_pair(1,"RNG"));
       m1.insert(make_pair(1,"IG"));
       cout<<m1.count(1)<<endl;//2
}

案例:5名员工 加入3个部门

公司今天招聘了 5 个员工,5 名员工进入公司之后,需要指派员工在那个部门工作 人员信息有: 姓名 年龄 电话 工资等组成
通过 Multimap 进行信息的插入 保存 显示 分1.2.3部门显示员工信息 显示全部员工信息

  • switch用法
  • 用vector存放person信息
  • 用multimap存放<部门号int,person>
  • m.count计数规定打印次数
  • lamba表达式[&]
#include <vector>
class Person
{
public:
    string name;
    int age;
    Person(string name,int age) {
        this->name=name;
        this->age=age;
    }
};
void createPersonVector(vector<Person>&v)
{
    v.push_back(Person("员工A",21));
    v.push_back(Person("员工B",23));
    v.push_back(Person("员工C", 21));
    v.push_back(Person("员工D", 22));
    v.push_back(Person("员工E", 21));

}
void PersonByGroup(vector<Person>&v,multimap<int,Person>&m)
{
    for(vector<Person>::iterator it=v.begin();it!=v.end();it++)
    {
        cout<<"请输入"<<(*it).name<<"将要加入的部门:1 2 3"<<endl;
        int operate=0;
        cin>>operate;
        if(operate>=1&&operate<=3)
        {
            m.insert(make_pair(operate,*it));
        }
    }
}
void showPersonList(multimap<int,Person>&m,int op)
{
    switch (op) {
    case 1:
        cout<<"研发部"<<endl;
        break;
    case 2:
        cout<<"测试部"<<endl;
        break;
    case 3:
        cout<<"人事部"<<endl;
        break;
    }
    int n=m.count(op);
    cout<<"部门的人数个数:"<<n<<endl;
    multimap<int,Person>::const_iterator ret;
    ret=m.find(op);
    if(ret!=m.end())
    {
        for(int i=0;i<n;i++,ret++)
        {
            cout<<"name="<<(*ret).second.name<<",age="<<(*ret).second.age<<endl;
        }
    }

}
void test04()
{
  vector<Person>v;//使用vector容器将员工信息存储起来
  createPersonVector(v);//创建5名员工
  multimap<int,Person>m;//存放员工<部门号、员工信息>
  PersonByGroup(v,m);//分部门
  //按部门查看员工信息
 showPersonList(m, 1);
 showPersonList(m, 2);
 showPersonList(m, 3);


}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值