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一样可以使用自动排序,或者自己编写排序函数排序

原文地址:https://www.cnblogs.com/fzxiaoyi/p/12112235.html