STL(标准模板库)-map容器

map容器的特点:

1、所有元素都会根据元素的键值自动排序

2、所有的元素都是pair,同时拥有键值和实值。第一个参数:键值 第二个参数:实值

3、map容器的键值唯一不可变 实值 可变。

在这里插入图片描述

map容器的API

案例1:map容器的插入、遍历

#include <iostream>
#include<map>
#include<string>
#include<algorithm>
using namespace std;

 map/multimap常用API
 map构造函数
map<T1, T2> mapTT;//map默认构造函数:
map(const map &mp);//拷贝构造函数
 map赋值操作
map& operator=(const map &mp);//重载等号操作符
swap(mp);//交换两个集合容器
 map大小操作
size();//返回容器中元素的数目
empty();//判断容器是否为空
 map插入数据元素操作
map.insert(...); //往容器插入元素,返回pair<iterator,bool>
map<int, string> mapStu;
// 第一种 通过pair的方式插入对象
mapStu.insert(pair<int, string>(3, "小张"));
// 第二种 通过pair的方式插入对象
mapStu.inset(make_pair(-1, "校长"));
// 第三种 通过value_type的方式插入对象
mapStu.insert(map<int, string>::value_type(1, "小李"));
// 第四种 通过数组的方式插入值
mapStu[3] = "小刘";
mapStu[5] = "小王";
 map删除操作
clear();//删除所有元素
erase(pos);//删除pos迭代器所指的元素,返回下一个元素的迭代器。
erase(beg,end);//删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。
erase(keyElem);//删除容器中key为keyElem的对组。
 map查找操作
find(key);//查找键key是否存在,若存在,返回该键的元素的迭代器;/若不存在,返回map.end();
count(keyElem);//返回容器中key为keyElem的对组个数。对map来说,要么是0,要么是1。对multimap来说,值可能大于1。
lower_bound(keyElem);//返回第一个key>=keyElem元素的迭代器。
upper_bound(keyElem);//返回第一个key>keyElem元素的迭代器。
equal_range(keyElem);//返回容器中key与keyElem相等的上下限的两个迭代器。

void myPrintMap01(map<int,string> &m)
{
    for(map<int,string>::const_iterator it=m.begin();it!=m.end();it++)
    {
        //*it == <int,string>
        cout<<"key="<<(*it).first<<", value="<<(*it).second<<endl;
    }
}
void test01()
{
    //存放9527--"星爷"  10086-"移动"   10010--"联通" 10000--"电信"
    //int为键值的类型  string为实值的类型
    map<int,string> m;

    //第1种:
    m.insert(pair<int,string>(9527,"星爷"));
    //第2种:(推荐)
    m.insert(make_pair(10086,"移动"));
    //第3种:
    m.insert(map<int,string>::value_type(10010,"联通"));
    //第4种:读map容器数据的时候 推荐
    m[10000] ="电信";//m.insert(make_pair(10000,"电信"));

    //m[10] 寻找key为10的实值
    //但是:如果容器中没有key为10 使用m[10] 会创建一个key为10实值为空的 对组
    //如果容器中有key为10  那么m[10]代表key=10的实值
    //建议:10是存在的
    cout<<m[10]<<endl;

    myPrintMap01(m);
#if 0
    for_each(m.begin(),m.end(),[](pair<int,string> val){
        cout<<"key="<<val.first<<", value="<<val.second<<endl;
    });
#endif

    //只想查看key==9527 的实值  (保证key是存在的)
    cout<<m[9527]<<endl;//"星爷"
    cout<<m[10010]<<endl;//"联通"

    //如果不能确定key值是否存在
    map<int,string>::const_iterator ret;
    ret = m.find(10086);
    if(ret == m.end())
    {
        cout<<"未找到相关节点"<<endl;
    }
    else
    {
        //ret代表的是key=10086的对组的迭代器
        cout<<"找到相关节点:key="<<\
              (*ret).first<<", value="<<(*ret).second <<endl;
    }

}
int main(int argc, char *argv[])
{
    test01();
    return 0;
}

运行结果:
在这里插入图片描述

案例2:map和vector容器配合使用(重要)

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

#include<numeric>//极少的算法
#include<stdlib.h>
#include<time.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){
        //val就是m容器中的key值
        cout<<m[val]<<"战队出场了"<<endl;
    } );
}

运行结果:
在这里插入图片描述

multimap容器

Multimap和map的操作类似,唯一区别multimap键值可重复。

Map和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;//2

    multimap<int,string> m1;
    m1.insert(make_pair(1,"RNG"));
    m1.insert(make_pair(1,"IG"));
    cout<<m1.count(1)<<endl;//2
}
案例:5名员工 加入3个部门
class Person
{
public:
    string name;
    int age;
    Person(string name, int age)
    {
        this->name = name;
        this->age = age;
    }
};
void createVectorPerson(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));
}
#include<vector>

void PersonByGroup(vector<Person> &v, multimap<int, Person> &m)
{
    //逐个将员工分配到 各个部门内
    for(vector<Person>::iterator it=v.begin();it!=v.end();it++)
    {
        //*it == Person
        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;
    }

    //注意:m中存放的数据《部门号、员工信息》
    //统计相同部门号的元素个数
    int n = m.count(op);
    cout<<"部门的人数个数:"<<n<<endl;
    //由于 multimap将key自动排序 重复  相同key一定挨在一起
    multimap<int, Person>::const_iterator ret;
    ret = m.find(op);
    if(ret != m.end())//寻找到key
    {
        for(int i=0;i<n;i++,ret++)
        {
            //(*ret) == <int, Person>
            //(*ret).second == Person
            cout<<"name = "<<(*ret).second.name<<",age = "<<\
                  (*ret).second.age<<endl;
        }
    }

}
void test04()
{
    //使用vector容器将员工信息存储起来
    vector<Person> v;

    //创建5名员工
    createVectorPerson(v);

    //将员工分配到不同的部门(员工<部门号、员工信息>)
    multimap<int, Person> m;//存放员工<部门号、员工信息>
    PersonByGroup(v, m);

    //按部门查看员工信息
    showPersonList(m, 1);
    showPersonList(m, 2);
    showPersonList(m, 3);
}

运行结果:
在这里插入图片描述
在这里插入图片描述

发布了78 篇原创文章 · 获赞 45 · 访问量 9264

猜你喜欢

转载自blog.csdn.net/weixin_43288201/article/details/105253570