• C++ STL(九)容器_map和multimap


    mpa是一个键值对(key,value)序列容器, 其中key是唯一的,提供基于key的快速查询能力.属于标准关联式容器的一种.

    元素插入过程是按排序规则插入,不能指定插入位置.

    它不支持随机存取元素,不能使用数组[]和at方式进行访问.

    map与multimap区别: map中key是唯一的,而multimpa中key可以出现多次

    所需头文件:#include<map>

    构造函数:

     1     //map
     2     map<int,string> mapA; //构造个空的map
     3     map<int,string> mapB(mapA); //通过mapA拷贝构造一个map (mapB=mapA)
     4 
     5     //使用迭代器构造    
     6     map<int,string> dIt(mapB.begin(),mapB.end()); //正向迭代器方式构造map 
     7     map<int,string> dRit(mapB.rbegin(), mapB.rend()); //反向迭代器方式构造map
     8 
     9     //multimap
    10     multimap<int,string> multimapA; //构造个空的multimap
    11     multimap<int,string> multimapB(multimapA); //通过multimapA拷贝构造一个multimap (multimapB=multimapA)
    12 
    13     //使用迭代器构造
    14     multimap<int,string> dItM(multimapB.begin(), multimapB.end()); //正向迭代器方式构造multimap
    15     multimap<int,string> dRiM(multimapB.rbegin(), multimapB.rend()); //反向迭代器方式构造multimap
    构造函数

    增加元素操作:

    注意:map元素中key是唯一的,无法插入相同key的元素. multiset中可以插入key重复的元素. 二种容器插入后都会自动进行排序

    1. insert()方式插入,如果是map返回的是pair, 如果是multimap返回的是迭代器

    使用pair方式插入              insert(pair<key,T>(key, T));   

    使用value_type方式插入  insert(map<key,T>::value_type(key,T)); 

    2.数组方式插入  multimap不能使用数组方式插入

    map对象[key] = T;  

    注意:使用数组方式时如果map中有相同的key,将会把key对应的值修改为新的值.

    如果不确定key是否存在,使用insert()保险,如果确定key不存在使用数组方式方便些

     1     //map元素中key是唯一的,无法插入相同key的元素
     2     map<int,string> mapA;
     3     pair<map<int,string>::iterator,bool> pairRtn;
     4     bool bInsertMap;
     5 
     6     //1.通过pair方式插入
     7     pairRtn = mapA.insert(pair<int,string>(0,"小王"));
     8     bInsertMap = pairRtn.second; //bInserMap = true  mapA={(0,"小王")}
     9 
    10     //2.通过type_value方式插入
    11     pairRtn = mapA.insert(map<int,string>::value_type(1,"小李"));
    12     bInsertMap = pairRtn.second; //bInserMap = true   mapA={(0,"小王"),(1,"小李")}
    13 
    14     pairRtn = mapA.insert(map<int,string>::value_type(1,"大大"));
    15     bInsertMap = pairRtn.second; //bInserMap = false  //key己经存在,无法插入相同key的元素
    16     //注意:前二种方式插入返回值都是一个pair对组,第一个参数是迭代器,第二个参数bool判断是否插入成功
    17 
    18     //3.通过数组方式插入,注意:使用时如果map中有相同的key,将会把key对应的值修改为新的值
    19     mapA[2] = "小张"; //mapA={(0,"小王"),(1,"小李"),(2."小张")}
    20     mapA[2] = "小黄"; //此时因为己经有key为2的主键,就会直接修改原有键为2对应的值为小黄
    21     //mapA={(0,"小王"),(1,"小李"),(2."小黄")}
    22 
    23     //总结:如果不确定key是否存在,使用insert()保险,如果确定key不存在使用数组方式方便些
    map插入
     1     //multimap中可以插入key重复的元素
     2     multimap<int,string> multimapA;
     3     multimap<int,string>::iterator itRtn;
     4 
     5     //1.通过pair方式插入
     6     itRtn = multimapA.insert(pair<int,string>(0,"小王"));//itRtn指向新插入元素(0,"小王")
     7 
     8     //2.通过type_value方式插入
     9     itRtn = multimapA.insert(map<int,string>::value_type(1,"小李"));//itRtn指向新插入元素(1,"小李")
    10     itRtn = multimapA.insert(map<int,string>::value_type(1,"大大"));//itRtn指向新插入元素(1,"大大")
    11     //注意:multimap二种方式返回的都是迭代器,而不是pair
    12 
    13     //注意:multimap不能使用数组方式插入
    multimap插入

    删除元素操作:

    注意:map元素中key是唯一的,所以删除时只会删除1个元素.multimap元素中key可以是重复的,所以根据key进行删除时只要相同的都会批量删除

    erase()  如果参数是key,返回删除元素个数. 如果参数是爹代器,返回指向下个元素的迭代器

     1     //map中元素是唯一的,所以删除时只会删除1个元素
     2     map<int,string> mapA;
     3     mapA.insert(pair<int,string>(0,"小赵"));
     4     mapA.insert(pair<int,string>(1,"小钱"));
     5     mapA.insert(pair<int,string>(2,"小孙"));
     6     
     7     size_t nCount = mapA.erase(1); //删除key为1的元素  mapA={0,"小赵"),2,"小孙")} nCount=1
     8     map<int,string>::iterator itMap;
     9     itMap = mapA.erase(mapA.begin()); //使用迭代器删除指向开始位置的元素 mapA={2,"小孙")} itMap指向下个元素
    10     mapA.clear(); //清除所有元素
    map删除
     1     //multimap中元素可以是重复的,所以根据key进行删除时只要相同的都会批量删除
     2     multimap<int,string> multimapA;
     3     multimapA.insert(pair<int,string>(0,"小赵"));
     4     multimapA.insert(pair<int,string>(1,"小孙"));
     5     multimapA.insert(pair<int,string>(0,"小钱"));
     6     multimapA.insert(pair<int,string>(2,"小李"));
     7 
     8     nCount = multimapA.erase(0); //删除key为0的元素  mapA={1,"小孙"),2,"小孙")} nCount=2
     9     multimap<int,string>::iterator itMultiMap;
    10     itMultiMap = multimapA.erase(multimapA.begin()); //使用迭代器删除指向开始位置的元素 mapA={2,"小孙")} itMap指向下个元素
    11     multimapA.clear(); //清除所有元素
    multimap删除

    获取大小:

    empty()  返回是否为空

    size()     返回大小

    max_size()  返回所能存储的最大元素个数,这是由系统自动定义的值

     1     //map
     2     map<int,string> mapA;
     3     bool bEmpty = mapA.empty(); //bEmpty = true
     4     int nSize = mapA.size();    //nsize = 0
     5     mapA.insert(map<int,string>::value_type(0,"小赵"));
     6     bEmpty = mapA.empty(); //bEmpty = false
     7     nSize = mapA.size();  //nSize = 1
     8     int nMaxSize = mapA.max_size(); //nMaxSize = 89478485 所能存储的最大元素个数,这是由系统自动定义的值
     9 
    10     //mulitmap
    11     multimap<int,string> multimapA;
    12     bEmpty = multimapA.empty(); //bEmpty = true
    13     nSize = multimapA.size();    //nsize = 0
    14     multimapA.insert(multimap<int,string>::value_type(0,"小赵"));
    15     multimapA.insert(multimap<int,string>::value_type(0,"小钱"));
    16     bEmpty = multimapA.empty(); //bEmpty = false
    17     nSize = multimapA.size();  //nSize = 2
    18     nMaxSize = multimapA.max_size(); 
    19 
    20     return;
    获取大小

    查找操作:

    find()  根据元素值进行查找,返回第一个找到的迭代器

    count(key) 根据元素值进行查找,返回元素个数. 注意: map返回的只有可能是0或者1,而multimap返回的可能是0和>0的元素个数

    lower_bound(elem) 返回第一个>=elem元素的迭代器

    upper_bound(elem) 返回第一个> elem元素的迭代器

    equal_range(elem) 返回容器中与elem相等的包含上下限二个迭代器的pair

     1     map<int,string> mapStu;
     2     mapStu.insert(pair<int,string>(3,"小张"));
     3     mapStu.insert(pair<int,string>(1,"小李"));
     4     mapStu.insert(pair<int,string>(5,"小王"));
     5     mapStu.insert(pair<int,string>(7,"小赵"));
     6     mapStu.insert(pair<int,string>(9,"小陈"));
     7     //find(key); 根据key进行查找,返回找到的迭代器,若不存在,返回值等于map.end()
     8     map<int,string>::iterator it = mapStu.find(3);
     9     if(it != mapStu.end())
    10     {
    11         cout<<"Ok,Find"<<endl;
    12     }else
    13     {
    14         cout<<"Error,Find"<<endl;
    15     }
    16 
    17     //count(keyElem) //返回容器中key为keyElem的对组个数
    18     //注意:对于map来说,要么是0,要么是1
    19     //而multimap中键可以是重复的,所以count()值可以是0,或者>=1
    20     int nCount = mapStu.count(99); //没有找到keyElem为99的元素,nCount=0
    21     nCount = mapStu.count(3); //nCount = 1
    22 
    23     //lower_bound(keyElem) 返回第一个>=keyElem元素的迭代器
    24     //upper_bound(keyElem) 返回第一个> keyElem元素的迭代器
    25     map<int,string>::iterator itLower = mapStu.lower_bound(5); // *itLower = 5
    26     map<int,string>::iterator itUpper = mapStu.upper_bound(5); // *itUpper = 7
    27 
    28     map<int,string>::iterator itLowerTwo = mapStu.lower_bound(6); // *itLowerTwo = 7
    29     map<int,string>::iterator itUpperTwo = mapStu.upper_bound(6); // *itUpperTwo = 7
    30 
    31     //equal_range(keyElem) 返回容器中与keyElem相等的包含上下限二个迭代器的pair
    32     //pair是个对组,包含二个迭代器,first与second
    33     //pair.first keyElem所在的迭代器
    34     //pair.second keyElem所在的下一个迭代器
    35     pair<map<int,string>::iterator, map<int,string>::iterator> itPair = mapStu.equal_range(5);
    36     map<int,string>::iterator itFirst = itPair.first; // *itFirst = 5
    37     map<int,string>::iterator itSecond = itPair.second; // *itSecond = 7
    38 
    39     return;
    查找操作

    排序操作:

    和set一样可以使用自动排序,或者自己编写排序函数排序

  • 相关阅读:
    python中将汉字转换成拼音
    关于拉格朗日和内维尔插值算法的python实现
    hdoj1874 (优先队列+Dijkstra)
    hdoj1325 Is It A Tree?
    poj2299 二分思想
    nyoj89 汉诺塔(二)
    nyoj914Yougth的最大化(二分搜索 + 贪心)
    nyoj832 合并游戏(状态压缩DP)
    zoj2432 hdoj1423 最长公共上升子序列(LCIS)
    poj1308 Is It A Tree?(并查集)详解
  • 原文地址:https://www.cnblogs.com/fzxiaoyi/p/12112235.html
Copyright © 2020-2023  润新知